Как отфильтровать 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))

Как заставить это работать 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

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

Другие вопросы по тегам