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。

如何按上述方式对查询集进行排序?

+0

有你在DateRenewed尝试排序第一,然后通过输入的日期? – 2014-09-02 15:32:58

+0

@BurhanKhalid,如果你这样做了,我认为所有更新的条目都会首先出现,只有那些没有更新日期的条目才会出现,即使它们更新。 user3138929,一种方法可能是将DateRenewed默认为当前日期(如DateEntered)而不是null,然后按此排序。通过比较DateRenewed和DateEntered,你仍然可以找到没有更新的条目。当然,你会不必要地存储一些(或许多)日期两次。 – 2014-09-02 16:08:30

+0

对不起,双重评论,但这发生在我身上......如果COALESCE选择第一个非空值,如果你倒转它的参数的顺序,它不会工作,给它date_renewed第一个? – 2014-09-02 16:14:26

如果我交换Paulo Almeida指出的列的顺序,COALESCE就起作用。 Paulo还正确地指出,Burhan Khalid所提出的解决方案是行不通的。

解决的办法是:

qs.extra(select={"sort_order":"COALESC(date_renewed,date_entered)"}, order_by=["-sort_order"])