Django запрос по отдельным полям даты и времени (как выполнить условный order_by)

У меня есть модель Meeting. В ней есть отдельное поле данных и времени, причина, по которой это не одно поле datetime, заключается в том, что время может быть равно null. Если я использую одно поле datetime и установлю часы/минуты в 00:00, если время не указано, то я не смогу отличить это от встречи, установленной в 00:00. А какое-нибудь необычное значение типа 13:37:42 как отсутствие встречи - это вообще убогая халтура.

Вот модель:

class Meeting(models.Model):
    meeting_date = models.DateField(db_index=True)
    meeting_time = models.TimeField(db_index=True, null=True, blank=True)

Теперь возникает проблема фильтрации по заданной дате/времени.

Поэтому я думаю, что решение состоит в том, чтобы фильтровать по дате, а затем упорядочивать по времени. Например, чтобы получить последнюю встречу, которая была до этого момента:

from datetime import datetime

now = datetime.now()
prev_meeting = (
    Meeting.objects.filter(meeting_date__lte=now.date())
    .order_by('-meeting_date', f'meeting_time <= {now.time()}', '-meeting_time')
    .first()
)

f'meeting_time <= {now.time()}' это та часть, которую я не знаю как сделать с django ORM, но я знаю как сделать с SQL. Django Docs не упоминают условное упорядочивание.

Решением, которое я придумал, является использование одного поля datetime для хранения даты/времени, а затем, вместо значения времени, у меня есть дополнительное булево значение, хранящее, было ли время установлено или нет. Если время не было установлено, то время datetime равно 00:00, а поле time_was_set устанавливается в False.

Вернуться на верх