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()
Вернуться на верх