Django-filter: TypeError: __init __ () получил неожиданный аргумент ключевого слова 'имя'

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

Я использую пример из документа:

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

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

Привет, @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 его проигнорирует.

Большое спасибо :-)

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