Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按日期时间订购Django查询集';s月/日?_Django_Datetime_Sql Order By_Django Queryset - Fatal编程技术网

按日期时间订购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']
)