Я использую пример из документа:
release_year__gt = django_filters.NumberFilter(name='release_date', lookup_expr='year__gt')
но я получил ошибку:
TypeError: __init__() got an unexpected keyword argument 'name'
когда я ищу код, я обнаружил, что «name» изменилось на «field_name», документ старый, верно ??
Также использую код:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = ['file_name', ]
выше в порядке, но когда я использую код:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name' : ['icontains'] }
Это не работает. Quey sql не имеет инструкции like %somevalue%
, почему?
Спасибо,
Крис
Привет, @zhangqunshi , похоже, вы используете предварительную версию 2.0.0.dev1. Вы правы, name
превратилось в field_name
. Документы не были обновлены, чтобы отразить это (что является одной из причин, почему это предварительный выпуск).
Нелегко отладить FileEvent
не видя реальной модели. Что произойдет, если вы выполните следующий запрос?
FileEvent.objects.filter(file_name__icontains='foo')
FileEvent прост, имеет только report_id, file_name и event_time. когда я использую:
FileEvent.objects.filter(file_name__icontains='foo')
Он станет sql:
select * from file_event where file_name like '%foo%'
Для кода:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = ['file_name', ]
он станет sql:
select * from file_event where file_name ='foo'
Для кода:
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name' : ['icontains'] }
он станет sql:
select * from file_event
Кстати, код для получения набора запросов:
filter = MyFilter(request.GET,
queryset=FileEvent.objects.values().filter(report_id=1).order_by(
'-event_time'))
print(filter.qs)
И я не могу найти никакой помощи от документа о том, как получить результат от фильтра в общем представлении, поэтому я ищу код и нахожу поле «qs» в BaseFilterSet, и оно работает.
Теперь я меняю код на:
class MyFilter(django_filters.FilterSet):
file_name = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = FileEvent
fields = ['file_name',]
и это работает, sql - это like '%foo%'
@zhangqunshi , я предполагаю, что вы фильтруете неправильную строку запроса. Должен быть:
/file-events?file_name__icontains=foo
Вы правы, я использую URL: /file-events?file_name=foo
Поскольку я думаю, что код уже определяет, поле file_name должно использовать icontains.
Ага. Сначала это нелогично, но изменение необходимо, потому что вы можете использовать синтаксис словаря для определения нескольких фильтров. Например,
class MyFilter(django_filters.FilterSet):
class Meta:
model = FileEvent
fields = {'file_name': ['icontains', 'istartswith', 'iendswith',]}
Это позволяет выполнять такие запросы, как /file-events?file_name__istarswith=foo&file_name__iendswith=log
хорошо, я понял, а код ['icontains', 'istartswith', 'iendswith',]
- это просто список поддерживаемых типов запросов. Если в запросе не используется ни один элемент списка, django-filter его проигнорирует.
Большое спасибо :-)
Самый полезный комментарий
Привет, @zhangqunshi , похоже, вы используете предварительную версию 2.0.0.dev1. Вы правы,
name
превратилось вfield_name
. Документы не были обновлены, чтобы отразить это (что является одной из причин, почему это предварительный выпуск).Нелегко отладить
FileEvent
не видя реальной модели. Что произойдет, если вы выполните следующий запрос?