Django annotate groupings by month

django, python

Solution

If you're on PostgreSQL, the following might work:

from django.db.models import Count

Link.objects.extra(select={'month': 'extract( month from pub_date )'}).values('month').annotate(dcount=Count('pub_date'))

I'm not sure how portable `extract` is across other databases.

Problem

I have a very basic model: ``` class Link(models.Model): title = models.CharField(max_length=250, null=False) user = models.ForeignKey(User) url = models.CharField(max_length=250, blank=True, null=True) link_count = models.IntegerField(default=0) pub_date = models.DateField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) ``` I can create a list of all the entries grouped by date using: ``` Link.objects.values('pub_date').order_by('-pub_date').annotate(dcount=Count('pub_date')) ``` This will naturally group items by day. But what I really want to do is group by month. Is there anyway I can do this using annotate()? Many thanks, G

Original source