Как отфильтровать дату gte, lte в поле даты и времени?

Я пытаюсь понять, как фильтровать QuerySet, используя дату, извлеченную из даты и времени.

Я использую 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.

>> 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))

>> []

Это потому, что он смотрит не только на дату, но и на время. Поэтому мне нужно извлечь дату, чтобы иметь возможность правильно фильтровать.


person Milano    schedule 13.09.2017    source источник


Ответы (2)


Если вы хотите сравнить только часть даты поля даты и времени, вам нужно использовать преобразование date. например,

Reservation.objects.filter(datetime__date__lte=date(2017, 1, 1))

Чтобы заставить это работать с FilterSets, не требуется специальный метод. Выражения фильтра создаются путем объединения аргументов 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
person Sherpa    schedule 13.09.2017

Если вы используете 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/

person Upsetcup18    schedule 15.02.2018