Bry*_*oso 7 django datetime sql-order-by django-queryset
我有一个人名单,每个人都有一个生日,可以预见存储在一个DateField.我正在尝试创建一个人员列表 - 按出生月份和日期(无视年份)排序 - 有一种"谁的生日即将到来"显示.
我似乎无法QuerySet通过这个人的datetime.month价值来订购.有没有办法可以做到这一点,而不必诉诸于胁迫list()?
在此先感谢,如果问题需要澄清,请告诉我.
您可以使用它QuerySet.extra()来定义月份字段并按其排序:
SomeModel.objects.extra(select={'birthmonth': 'MONTH(birthdate)'},
order_by=['birthmonth'])
Run Code Online (Sandbox Code Playgroud)
对于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)