Ordering a Django QuerySet by a datetime's month/day?
You can use QuerySet.extra()
to define a month field and sort by it:
SomeModel.objects.extra(select={'birthmonth': 'MONTH(birthdate)'},
order_by=['birthmonth'])
For django >= 2.1
You can sort the QuerySet by using month and day lookup names on DateField.
SomeModel.objects.order_by('birth_date__month', 'birth_date__day')
For django >= 1.10
Use database-function Extract to generate extra month and day columns by annotate method, then order_by
these columns you can sort the QuerySet
by their birthday only.
from django.db.models.functions import Extract
SomeModel.objects.annotate(
birth_date__month = Extract('birth_date', 'month'),
birth_date__day = Extract('birth_date', 'day')
).order_by('birth_date__month', 'birth_date__day')
For older django versions
For older django
versions you can do the same using QuerySet.extra(), but you have to write database specific query.
MySQL
SomeModel.objects.extra(select={ 'birth_date_month': 'MONTH(birth_date)', 'birth_date_day': 'DAY(birth_date)' }, order_by=['birth_date_month','birth_date_day'] )
PostgreSQL
SomeModel.objects.extra(select={ 'birth_date_month': 'EXTRACT(MONTH FROM birth_date)', 'birth_date_day': 'EXTRACT(DAY FROM birth_date)' }, order_by=['birth_date_month','birth_date_day'] )
SQlite
SomeModel.objects.extra(select={ 'birth_date_month': 'strftime("%m", birth_date)', 'birth_date_day': 'strftime("%d", birth_date)' }, order_by=['birth_date_month','birth_date_day'] )
Newer versions of django have the lookup on DateFields and DateTimeFields. https://docs.djangoproject.com/en/1.11/ref/models/database-functions/#extract
MyModel.objects.order_by('birthday__month', 'birthday__day')