Skip to main content
 首页 » 编程设计

python之Django queryset order_by 日期接近今天

2024年08月22日27落叶无声

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

今天
明天
明天+1
.
.
.
昨天
昨天-1

请您参考如下方法:

是的,您可以,您想要的是 order_by 的下降行为.

最早的项目优先。

Model.objects.order_by('creation_time') 

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

Model.objects.order_by('-creation_time') 

供您编辑

你必须进行两个查询,然后将它们评估为列表来做你想做的事情,你不能用 django ORM 的查询做这样的事情。

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

qset = Model.objects.all() 
result = qset.filter(creation=today) | qset.filter(creation_gte=today) | qset.filter(creation_lt=today) 

以下结果 将包含您想要的所有项目,但不会保留单个查询集排序。所以,不会做你想从中得到的东西。

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

qset = Model.objects.all() 
result = list(qset.filter(creation=today)) + list(qset.filter(creation_gte=today)) + list(qset.filter(creation_lt=today)) 

或者以更好的方式:

import itertools 
result = list(itertools.chain(qset.filter(creation=today), qset.filter(creation_gte=today), qset.filter(creation_lt=today))) 

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