Django的查询集ORDER_BY两列
问题描述:
的较大值我有以下的Django模型:创建条目对象时Django的查询集ORDER_BY两列
class Entry(models.Model):
date_entered = models.DateTimeField(auto_now_add=True)
date_renewed = models.DateTimeField(blank=True,null=True)
date_enterd自动填充和date_renewed日提交被设置为NULL。有些参赛作品有时不会更新(这意味着有些参赛作品会设置日期时间,有些则始终为空)。
我需要按照两者中最近的时间排序查询集,如果旧条目被更新,它应该是查询集中的第一个对象,但是当添加新的条目时,更新的条目应该去第二位。
条目应如下返回:
ID DateEntered DeteRenewed
55 2014-09-02 13:39:37.698422+00:00 None
45 2014-08-06 00:00:00+00:00 2014-08-31 11:43:05.339902+00:00
54 2014-08-31 00:00:00+00:00 None
43 2014-08-06 00:00:00+00:00 2014-08-30 10:49:51.594024+00:00
51 2014-08-15 00:00:00+00:00 2014-08-29 10:49:51.594024+00:00
我已经尝试使用:
qs.extra(select={"sort_order":"COALESC(date_entered,date_renewed)"}, order_by=["-sort_order"])
但它选择的第一个非空值,这是行不通的。
我在开发中使用Postgres和生产中的SQLite。如果可能,我想坚持Django的ORM。
如何按上述方式对查询集进行排序?
答
如果我交换Paulo Almeida指出的列的顺序,COALESCE就起作用。 Paulo还正确地指出,Burhan Khalid所提出的解决方案是行不通的。
解决的办法是:
qs.extra(select={"sort_order":"COALESC(date_renewed,date_entered)"}, order_by=["-sort_order"])
有你在DateRenewed尝试排序第一,然后通过输入的日期? – 2014-09-02 15:32:58
@BurhanKhalid,如果你这样做了,我认为所有更新的条目都会首先出现,只有那些没有更新日期的条目才会出现,即使它们更新。 user3138929,一种方法可能是将DateRenewed默认为当前日期(如DateEntered)而不是null,然后按此排序。通过比较DateRenewed和DateEntered,你仍然可以找到没有更新的条目。当然,你会不必要地存储一些(或许多)日期两次。 – 2014-09-02 16:08:30
对不起,双重评论,但这发生在我身上......如果COALESCE选择第一个非空值,如果你倒转它的参数的顺序,它不会工作,给它date_renewed第一个? – 2014-09-02 16:14:26