2014-09-02 2 views
0

У меня есть следующие модели Django:Джанго QuerySet 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. Некоторые записи обновляются, некоторые - нет (это означает, что некоторые записи будут иметь дату и время, а некоторые всегда будут 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"]) 

, но это не работает, как он выбирает первое значение не является Null.

Я использую Postgres в производстве и SQLite в dev. Я хотел бы придерживаться ORM Django, если это возможно.

Как заказать запрос, как указано выше?

+0

Пытались ли вы заказ на DateRenewed первый, а затем по дате Поступил? –

+0

@BurhanKhalid, если вы это сделали, я думаю, что все обновленные записи будут первыми, а только те, у которых нет даты продления, даже если они были более свежими. user3138929, одним из способов может быть значение по умолчанию DateRenewed на текущую дату (например, DateEntered) вместо NULL и сортировка по этому значению. Вы все равно можете найти записи без обновления, сравнив DateRenewed с DateEntered. Конечно, вы будете хранить некоторые (или многие) даты дважды, без необходимости. –

+0

Извините за двойной комментарий, но это произошло со мной ... если COALESCE выбирает первое ненулевое значение, не будет ли оно работать, если вы перевернули порядок своих аргументов, указав сначала date_renewed? –

ответ

0

COALESCE работает, если я поменяю порядок столбцов, как указал Пауло Алмейда. Пауло также справедливо указал, что решение, поданное Бурханом Халидом, не будет работать.

Решение:

qs.extra(select={"sort_order":"COALESC(date_renewed,date_entered)"}, order_by=["-sort_order"]) 
Смежные вопросы