I have a Meeting model. It has a separate date and time field, the reason why it is not a single datetime field is that the time is allowed to be null.
If I used a single datetime field and set the hours/minutes to 00:00 if no time is given, then I can't distinguish that from a meeting set at 00:00. And some unusual sentinel value like 13:37:42 as no meeting is a weird hack.
Here's the model:
class Meeting(models.Model):
meeting_date = models.DateField(db_index=True)
meeting_time = models.TimeField(db_index=True, null=True, blank=True)
Now the problem comes in to filter by a given date/time.
So I think the solution is to filter by date, then order by the time. E.g. to get the latest meeting that is before now:
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()
)
The f'meeting_time <= {now.time()}' is the part I don't know how to do with the django ORM, but I know how to do with SQL. the Django Docs do not mention conditional ordering.