按日期时间订购Django查询集';s月/日?
我有一个人的列表,每个人都有一个生日,可以预见,它存储在按日期时间订购Django查询集';s月/日?,django,datetime,sql-order-by,django-queryset,Django,Datetime,Sql Order By,Django Queryset,我有一个人的列表,每个人都有一个生日,可以预见,它存储在日期字段中。我正在尝试创建一个按出生月份和日期(不考虑年份)排序的名单,以显示“谁的生日即将到来” 我似乎无法按人员的datetime.month值订购QuerySet。是否有任何方法可以做到这一点,而不必强制使用列表() 提前感谢,如果问题需要澄清,请告诉我。您可以使用定义月份字段并按其排序: SomeModel.objects.extra(select={'birthmonth': 'MONTH(birthdate)'}, or
日期字段中。我正在尝试创建一个按出生月份和日期(不考虑年份)排序的名单,以显示“谁的生日即将到来”
我似乎无法按人员的datetime.month
值订购QuerySet
。是否有任何方法可以做到这一点,而不必强制使用列表()
提前感谢,如果问题需要澄清,请告诉我。您可以使用定义月份字段并按其排序:
SomeModel.objects.extra(select={'birthmonth': 'MONTH(birthdate)'},
order_by=['birthmonth'])
较新版本的django具有对DateFields和DateTimeFields的查找功能。
MyModel.objects.order\u by('birth\u month','birth\u day')
我使用django 1.10.8进行了测试
对于django>=2.1
您可以使用DateField上的月份和日期查找名称对查询集进行排序
SomeModel.objects.order_by('birth_date__month', 'birth_date__day')
对于django>=1.10
使用数据库功能按方法生成额外的月和日列,然后按order\u
这些列您可以仅按生日对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')
对于较旧的django版本
对于较旧的django
版本,可以使用执行相同的操作,但必须编写特定于数据库的查询
- MySQL
- PostgreSQL
- SQlite
Post.objects.all().order\u by('date\u posted\u minute')。reverse()
“发布日期”是您在发布模型中使用的属性
Post只是一个示例模型
谢谢你的快速回答!我只是想澄清一下,对于那些使用PostgreSQL将MONTH(birthdate)
替换为EXTRACT(MONTH FROM birthdate)
的人来说,正确的方法名是额外的。尽管我非常喜欢这个答案,但QuerySet.extra()方法似乎已经过时了,最终会被弃用。Django文档状态,“使用这种方法作为最后的手段”和“这是一个旧的API,我们的目的是在未来某个点贬低。”请考虑添加一些解释给你回答。嗨,Janaki,谢谢张贴!在你的答案中添加更多细节,并使用他们使用的术语(出生月/日,而不是发布日期),将有助于海报理解你的答案,而无需他们提出后续问题。看看这个问题的其他答案,了解需要什么。这也有助于提高效率。
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')
SomeModel.objects.extra(select={
'birth_date_month': 'MONTH(birth_date)',
'birth_date_day': 'DAY(birth_date)'
},
order_by=['birth_date_month','birth_date_day']
)
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']
)
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']
)