Как сделать фильтр диапазона по времени в 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
Вернуться на верх