Skip to content Skip to sidebar Skip to footer

Django Getting Month From Date For Aggregation

I am trying to get a sum per month response in a DJango ORM query call: models.Subscription.objects.all().extra(select={'Month': 'EXTRACT(Month FROM Modified)'}).annotate(count_ite

Solution 1:

Did you try looking at your schema? I think you just got your column name wrong.

Assuming you are using Djnago>=1.8 you can also avoid the whole issue by writing a Func like this one:

class ExtractMonth(Func):
    template = "EXTRACT(MONTH FROM %(expressions)s)"

    def __init__(self, *expressions, **extra):
        extra['output_field'] = SmallIntegerField()
        super().__init__(*expressions, **extra)
       

and using it like this:

Subscription.objects.annotate(Month=ExtractMonth('Modified'))\
                .values('Month').annotate(Count('Month'))

This way 'Modified' is the name of the field on your model and Django resolves the column name for you.

Update

There is a more generic solution proposed in this 1.9 ticket.


Post a Comment for "Django Getting Month From Date For Aggregation"