Python Django:如何订购queryset并将一些项目移动到queryset的末尾
我在Django应用程序中有一个查询集:Python Django:如何订购queryset并将一些项目移动到queryset的末尾,python,django,django-queryset,Python,Django,Django Queryset,我在Django应用程序中有一个查询集: databytes_all = DataByte.objects databytes\u allqueryset中的每个项都有许多属性,但其中一个属性是publish\u date 我想在publish\u date之前订购查询集,但是如果publish\u date为None,我希望该项位于查询集的末尾 这是我正在尝试的,但它不起作用: databytes_all = DataByte.objects 创建查询集:过滤掉所有没有的发布日期 no_d
databytes_all = DataByte.objects
databytes\u all
queryset中的每个项都有许多属性,但其中一个属性是publish\u date
我想在publish\u date
之前订购查询集,但是如果publish\u date
为None
,我希望该项位于查询集的末尾
这是我正在尝试的,但它不起作用:
databytes_all = DataByte.objects
创建查询集:过滤掉所有没有的发布日期
no_date = databytes_all.filter(publish_date=None)
进行另一个查询集:排除“发布日期”为“无”的所有项目,然后按“发布日期”对其余项目排序
databytes_with_date = databytes_all.order_by('-publish_date').exclude(publish_date=None)
现在合并两个查询集(但是这不起作用-没有发布日期的项目是列表中的第一个,而我希望它们是最后一个)
您不需要进行筛选,您可以指定
NULL
应该是最后一个:
from django.db.models import F
databytes_all.order_by(F('publish_date').desc(nulls_last=True))
由于
False
/0
被视为小于True
/1
,因此它会将带有publish\u date
的项目移动到您检索的记录底部。您不需要过滤,您可以指定NULL
应在以下项的最后:
from django.db.models import F
databytes_all.order_by(F('publish_date').desc(nulls_last=True))
由于
False
/0
被认为小于True
/1
,因此它会将带有publish\u date
的项目移动到您检索的记录的底部。在Django中,您可以使用chain组合许多查询集
试试这个:
from itertools import chain
...
combined_results = list(chain(databytes_with_date, no_date))
在Django中,可以使用chain组合许多QuerySet 试试这个:
from itertools import chain
...
combined_results = list(chain(databytes_with_date, no_date))