Ana, parte de nuestro equipo, nos ha hecho el favor de crear este artículo porque controla a la perfección el tema.
Solución:
Puedes usar QuerySet.extra()
para definir un campo de mes y ordenar por él:
SomeModel.objects.extra(select='birthmonth': 'MONTH(birthdate)',
order_by=['birthmonth'])
Para django >= 2.1
Puede ordenar el QuerySet usando nombres de búsqueda de mes y día en DateField.
SomeModel.objects.order_by('birth_date__month', 'birth_date__day')
Para django >= 1.10
Use la función de base de datos Extraer para generar columnas adicionales de mes y día mediante el método de anotación, luego order_by
estas columnas se puede ordenar el QuerySet
solo por su cumpleaños.
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')
Para versiones anteriores de django
para mayores django
versiones puedes hacer lo mismo usando QuerySet.extra(), pero tienes que escribir consulta específica de la base de datos.
-
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'] )
Las versiones más nuevas de django tienen la búsqueda en DateFields y DateTimeFields. https://docs.djangoproject.com/en/1.11/ref/models/database-functions/#extract
MyModel.objects.order_by('birthday__month', 'birthday__day')
Aquí tienes las reseñas y puntuaciones
Nos puedes proteger nuestra función fijando un comentario y dejando una valoración te estamos eternamente agradecidos.