Saltar al contenido

¿Ordenar un Django QuerySet por mes/día de una fecha y hora?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *