Django упорядочивает модели по дате и перемещает модели без даты в конец
У меня есть модель билетов, с суммой в ней. Я пытаюсь сделать расходование билетов по ближайшей дате истечения срока действия. Но если я упорядочиваю по date_expire, то модели с date_expire=None перемещаются наверх. Но date_expire=None означает, что билет не имеет ограничения по времени, и должен использоваться после всех билетов, которые имеют ограничение по времени.
Мой код:
ticket = Tickets.objects.filter(
sum__gte=0,
date_expire__gte=timezone.now(),
user_id=user.id,
burned=False
).order_by(
'date_expire'
).first()
Я могу попробовать сортировать по sorted func с лямбда-ключом, но я думаю, что есть лучший способ сделать это в orm
Возможно, это не официальное решение:
Одним из методов является введение значения, которое представляет собой потолочное значение. Так, вместо None для date_expire используйте дату на 1000 лет в будущем, например 12/31/3000
. Таким образом, эта дата всегда будет позже ваших текущих дат.
Вы можете использовать выражение F
с nulls_first
или nulls_last
. Проверьте Using F() to sort null values на документации django.
В вашем случае:
from django.db.models import F
ticket = Tickets.objects.filter(
sum__gte=0,
date_expire__gte=timezone.now(),
user_id=user.id,
burned=False
).order_by(
F('date_expire').desc(nulls_last=True)
).first()