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
.