Как сделать фильтр диапазона по времени в django orm?
Есть функция, которая получает дату, мне нужно отфильтровать модель по дате, которая находится между date_start и date_end. Я пытался использовать gte/lte/range[], но это не работает правильно.
Модель:
class ModeratorAbsent(models.Model):
created_by = models.ForeignKey(User, models.SET_NULL, null=True)
moderator = models.ForeignKey(Moderator, models.CASCADE)
date_start = models.DateTimeField()
date_end = models.DateTimeField()
absent_type = models.ForeignKey(AbsentType, models.SET_NULL, null=True)
deleted = models.BooleanField(default=False)
class Meta:
db_table = 'moderators_absent'
default_permissions = ()
Пользовательская функция:
def check_moderator_absent(self, moderator: Moderator, day: datetime, absent_types: [str]) -> bool:
moderator_absents = ModeratorAbsent.objects.filter(moderator=moderator,
absent_type__name__in=absent_types,
deleted=False)
if moderator_absents.exists():
return True
return False
Данные базы данных: db data
Пример:
start = (day.combine(day.date(), day.min.time())) # 2022-03-16 00:00:00
end = (day.combine(day.date(), day.max.time())) # 2022-03-16 23:59:59.999999
moderator_absents = ModeratorAbsent.objects.filter(moderator=moderator,
date_start__gte=start,
date_end__lte=end,
absent_type__name__in=absent_types,
deleted=False)
Моя версия выглядит ужасно:
Функция будет принимать различные даты в цикле, и я хотел бы сразу фильтровать данные по дате, но теперь мне придется каждый раз получать все данные из модели
moderator_absents = ModeratorAbsent.objects.filter(moderator=moderator,
absent_type__name__in=absent_types,
deleted=False)
for absent in moderator_absents:
range_dates = map(lambda x: x.date(),
self.__dates_service.create_days_from_range_dates(absent.date_start,
absent.date_end))
if day.date() in range_dates:
return True
return False