Как фильтровать объекты в определенном временном диапазоне в 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)
для точного получения всех остальных.