Django queryset order_by 日期接近今天

Rod*_*ini 10 python sorting django sql-order-by

我想在顶部显示接近今天日期的记录,然后在底部显示过去的所有记录:

今天
明天
明天+1

.
.
昨天
昨天 -1

Spi*_*Xel 18

是的,你可以,你想要的是order_by的降序行为。

首先是最古老的项目。

Model.objects.order_by('creation_time')
Run Code Online (Sandbox Code Playgroud)

最新商品优先。(你想要什么)

Model.objects.order_by('-creation_time')
Run Code Online (Sandbox Code Playgroud)

供您编辑

您必须进行两个查询,然后将它们评估为列表以执行您所需要的操作,您不能使用 django ORM 的查询执行此类操作。

事实上,使用|组合查询 运算符不会保留您想要的顺序,因此您不能使用 2 django 查询来执行此操作。

qset = Model.objects.all()
result = qset.filter(creation=today) | qset.filter(creation_gte=today) | qset.filter(creation_lt=today)
Run Code Online (Sandbox Code Playgroud)

以下result将包含您想要的所有项目,但不会保留单个查询集排序。所以,不会做你想做的事。

所以总而言之,您必须评估查询集,并将它们作为列表添加在一起以实现您想要的。

qset = Model.objects.all()
result = list(qset.filter(creation=today)) + list(qset.filter(creation_gte=today)) + list(qset.filter(creation_lt=today))
Run Code Online (Sandbox Code Playgroud)

或者以更好的方式:

import itertools
result = list(itertools.chain(qset.filter(creation=today), qset.filter(creation_gte=today), qset.filter(creation_lt=today)))
Run Code Online (Sandbox Code Playgroud)

不要忘记order_by在每个查询集中执行s 以根据需要对结果的每个部分进行排序,为了代码简洁,我没有在这里写它们。