2016-09-17 109 views
1

Django的查询集ORDER_BY日期我想告诉在附近的顶部,在过去的记录,以今天的日期,然后所有记录在底部:附近今天

今天
明天
明天+ 1



昨天
昨天-1

+0

使用 - 在排序顺序颠倒顺序 –

回答

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) 

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

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

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 S IN每个查询集命令结果的每一部分,只要你想,对代码的简洁,我没在这里写下它们。

+0

我更新的问题,我不太清楚 –

+0

@RodrigoTravessini你不能做这样的事情,而无需通过Django的查询集(即**查询集的私有方法的黑客攻击你的方式。 _result_cache **),我已经更新了我的答案。 – SpiXel