Как отфильтровать gte,lte дату в поле datetime?
Я пытаюсь выяснить, как фильтровать QuerySet, используя дату, извлеченную из datetime.
я использую Django-filter
и я не могу составить такой поиск без перебора QuerySet, который очень неэффективен.
Я старался datetime__date__gte
который не работает.
class MyReservationsFilter(FilterSet):
datetime__lte = DateFilter(method='datetime_filter',name='lte')
class Meta:
model = Reservation
fields = {'status': ['exact'],
# 'datetime': ['lte', 'gte'],
'destination_from': ['exact'],
'destination_to': ['exact'],}
def datetime_filter(self, queryset, name, value):
lookup = 'datetime__'+name
return queryset.filter(**{lookup:value})
Вы знаете, что делать?
Я не могу использовать datetime__lte/gte
так как:
у меня есть Reservation
объект р.
>> r.datetime
>> datetime.datetime(2017, 8, 31, 17, 55)
>> r.datetime.date()
>> datetime.date(2017, 8, 31)
Итак, теперь я пытаюсь фильтровать по дате:
Reservation.objects.filter(datetime__lte=datetime.date(2017, 8, 31),datetime__gte=datetime.date(2017, 8, 31))
>> []
Это потому, что это выглядит не только по дате, но и по времени. Поэтому мне нужно извлечь дату, чтобы иметь возможность правильно фильтровать.
2 ответа
Если вы хотите сравнить только часть даты в поле даты и времени, вам нужно использовать date
преобразования. например,
Reservation.objects.filter(datetime__date__lte=date(2017, 1, 1))
Как заставить это работать FilterSet
s не требует специального метода. Выражения фильтра создаются путем присоединения field_name
а также lookup_expr
аргументы конструктора фильтра. field_name
Аргумент должен соответствовать имени поля модели, а lookup_expr
следует учитывать тип преобразования и поиска.
class MyReservationsFilter(FilterSet):
datetime__lte = DateFilter(field_name='datetime', lookup_expr='date__lte')
class Meta:
model = Reservation
Если вы используете Django 1.9, вы можете фильтровать с
Model.objects.filter(datetime__date = date.today())
если нет, вы можете фильтровать, как это
Model.objects.filter(post_date__year=date.year,
post_date__month=date.month,
post_date__day=date.day)
это слишком много печатать, я знаю. Но это единственный способ, который я предполагаю.
Нашел это здесь: https://chrisbartos.com/articles/how-to-filter-a-datetimefield-by-todays-date-in-django/