Я пытался реализовать описанную здесь фильтрацию: 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')
Хм. Мой первый ответ - просто принять это как ограничение синтаксиса словаря 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 Хотели бы вы отметить это ограничение в документах? Я буду рад сделать для этого запрос на вытягивание, если вы считаете, что это уместно.
Самый полезный комментарий
Вы можете использовать
Meta.filter_overrides
, чтобы изменить класс фильтра, используемый для поля модели.