У меня есть следующие модели 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, если это возможно.
Как заказать запрос, как указано выше?
Пытались ли вы заказ на DateRenewed первый, а затем по дате Поступил? –
@BurhanKhalid, если вы это сделали, я думаю, что все обновленные записи будут первыми, а только те, у которых нет даты продления, даже если они были более свежими. user3138929, одним из способов может быть значение по умолчанию DateRenewed на текущую дату (например, DateEntered) вместо NULL и сортировка по этому значению. Вы все равно можете найти записи без обновления, сравнив DateRenewed с DateEntered. Конечно, вы будете хранить некоторые (или многие) даты дважды, без необходимости. –
Извините за двойной комментарий, но это произошло со мной ... если COALESCE выбирает первое ненулевое значение, не будет ли оно работать, если вы перевернули порядок своих аргументов, указав сначала date_renewed? –