Как фильтровать объекты в определенном временном диапазоне в Django

Как вы фильтруете объекты в определенном диапазоне времени, включая минуты?

Итак, у меня есть система тикетов, в которой пользователи сообщают о времени работы над конкретными тикетами. Мне нужно отфильтровать эти данные для отчета. В настоящее время я использую Q(time_to__hour__range=(9, 17)), который выбирает все объекты с 9:00 до 17:59, но руководству нужно, чтобы отчет был до 18:05.

Вот фильтр, который я использую в настоящее время:

f = Q(time_from__range=[form.cleaned_data.get('date_range_from'),
      form.cleaned_data.get('date_range_to') + timedelta(days=1)])\
    & Q(client__in=form.cleaned_data.get('client_set') if form.cleaned_data.get('client_set') else 
        Clients.objects.all())\
    & Q(tech__in=form.cleaned_data.get('tech_set') if form.cleaned_data.get('tech_set') else 
        Tech.objects.all())

if form.cleaned_data.get('selection') == '1':
    f &= Q(time_to__hour__range=(9, 17))
elif form.cleaned_data.get('selection') == '2':
    f &= ~Q(time_to__hour__range=(9, 17))

p.s. Django версии 3.1.1

Один трюк (зависит от размера данных) - получить данные до 7 вечера (19:00) и отфильтровать полученные данные по размеру python, чтобы удалить лишнюю запись (после 18:05).

Поскольку вы уже используете объекты Q, вы можете указать дополнительные минуты в часе 18, введя другой объект Q.

time_range = Q(time_to__hour__range=(9, 17)) | \
             Q(time_to__hour = 18, time_to__minute__range=(0,5) )
if form.cleaned_data.get('selection') == '1':
    f &= time_range
elif form.cleaned_data.get('selection') == '2':
    f &= ~time_range # I'm less certain here

Я не могу найти документацию по оператору ~ на объектах Q. Я бы построил queryset, используя .filter(time_range) для включения и .exclude(time_range) для точного получения всех остальных.

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