按日期时间的月/日订购Django QuerySet?

Bry*_*oso 7 django datetime sql-order-by django-queryset

我有一个人名单,每个人都有一个生日,可以预见存储在一个DateField.我正在尝试创建一个人员列表 - 按出生月份日期(无视年份)排序 - 有一种"谁的生日即将到来"显示.

我似乎无法QuerySet通过这个人的datetime.month价值来订购.有没有办法可以做到这一点,而不必诉诸于胁迫list()

在此先感谢,如果问题需要澄清,请告诉我.

Ign*_*ams 8

您可以使用它QuerySet.extra()来定义月份字段并按其排序:

SomeModel.objects.extra(select={'birthmonth': 'MONTH(birthdate)'},
    order_by=['birthmonth']) 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的快速回答!只是想澄清那些使用PostgreSQL用`EXTRACT(MONTH FROM birthdate)替换`MONTH(birthdate)`的人. (5认同)

Mun*_*nna 5

对于Django> = 2.1

您可以通过使用DateField上的月份和日期查找名称对QuerySet进行排序。

SomeModel.objects.order_by('birth_date__month', 'birth_date__day')
Run Code Online (Sandbox Code Playgroud)

对于Django> = 1.10

使用数据库功能提取通过注释方法生成额外的月份和日期列,然后order_by您只能QuerySet按其生日对这些列进行排序。

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')
Run Code Online (Sandbox Code Playgroud)

对于较旧的Django版本

对于较旧的django版本,可以使用QuerySet.extra()进行相同的操作,但是必须编写特定数据库的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']
    )
    
    Run Code Online (Sandbox Code Playgroud)
  • 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']
    )
    
    Run Code Online (Sandbox Code Playgroud)
  • 方格

    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']
    )
    
    Run Code Online (Sandbox Code Playgroud)