Django-filter: TypeError:__ init __()が予期しないキーワード引数 'name'を取得しました

作成日 2017年11月04日  ·  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プレリリースを使用しているようです。 正解です。 namefield_name 。 ドキュメントはこれを反映するように更新されていません(これがプレリリースである理由の一部です)。

実際のモデルを見ずにFileEventをデバッグするのは簡単ではありません。 次のクエリを実行するとどうなりますか?

FileEvent.objects.filter(file_name__icontains='foo')

全てのコメント7件

こんにちは@ zhangqunshi 、2.0.0.dev1プレリリースを使用しているようです。 正解です。 namefield_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)

そして、共通のビューでフィルターから結果を取得する方法について、docからのヘルプを見つけることができないので、コードを検索して、BaseFilterSetでフィールド 'qs'を見つけます。

今私はコードを次のように変更します:

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 評価