Django-filter: Сравнение проблем IsoDateTimeFilter, отличных от «точных»

Созданный на 14 сент. 2017  ·  3Комментарии  ·  Источник: carltongibson/django-filter

Я пытался реализовать описанную здесь фильтрацию: http://django-filter.readthedocs.io/en/develop/ref/filters.html#isodatetimefilter

Хотя этот метод работает, мне нужно было больше, чем просто «точное» соответствие, поэтому я заменил:
fields = ['published']
с участием:
fields = {'published': ['exact', 'gte', 'lte']}
Это по-прежнему работает для «точной» фильтрации с IsoDateTime, но для «gte» и «lte» происходит сбой при использовании IsoDateTime. Он работает при использовании DateTime.

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

published = django_filters.IsoDateTimeFilter(
    name='published', lookup_expr='exact')
published_gte = django_filters.IsoDateTimeFilter(
    name='published', lookup_expr='gte')
published_lte = django_filters.IsoDateTimeFilter(
    name='published', lookup_expr='lte')

Самый полезный комментарий

Вы можете использовать Meta.filter_overrides , чтобы изменить класс фильтра, используемый для поля модели.

class BookFilter(django_filters.FilterSet):

    class Meta:
        model = Book
        fields = {'published': ['exact', 'lte', 'gte']}
        filter_overrides = {
            models.DateTimeField: {'filter_class': django_filters.IsoDateTimeFilter},
        }

Все 3 Комментарий

Хм. Мой первый ответ - просто принять это как ограничение синтаксиса словаря fields . Явное объявление полей — ваш «обходной путь» — это канонический способ сделать это. Синтаксис словаря — это просто ярлык, и нет никаких проблем с его ограничениями.

Сказав это, я бы взял небольшое изменение, чтобы "исправить" это...

Вы можете использовать Meta.filter_overrides , чтобы изменить класс фильтра, используемый для поля модели.

class BookFilter(django_filters.FilterSet):

    class Meta:
        model = Book
        fields = {'published': ['exact', 'lte', 'gte']}
        filter_overrides = {
            models.DateTimeField: {'filter_class': django_filters.IsoDateTimeFilter},
        }

@carltongibson Я рад принять ограничение. Я попытался найти быстрое «исправление», но мое понимание внутренней работы кода на данный момент слишком ограничено :/

@rpkilby Спасибо, ваше предложение работает хорошо, я буду использовать его в будущем :)

@carltongibson Хотели бы вы отметить это ограничение в документах? Я буду рад сделать для этого запрос на вытягивание, если вы считаете, что это уместно.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги