私はドキュメントの例を使用します:
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)
そして、共通のビューでフィルターから結果を取得する方法について、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はそれを無視します。
どうもありがとう :-)
最も参考になるコメント
こんにちは@ zhangqunshi 、2.0.0.dev1プレリリースを使用しているようです。 正解です。
name
はfield_name
。 ドキュメントはこれを反映するように更新されていません(これがプレリリースである理由の一部です)。実際のモデルを見ずに
FileEvent
をデバッグするのは簡単ではありません。 次のクエリを実行するとどうなりますか?