Django-filter: ArrayFieldのフィルタリング

作成日 2016年08月24日  ·  4コメント  ·  ソース: carltongibson/django-filter

で定義されたフィルタフィールドにそれが可能であるdjango.contrib.postgres.fieldsのようにArrayField

最も参考になるコメント

django-filterには現在、postgrescontribフィールドと互換性のあるフィルターがありません。独自のフィルターを作成する必要があります。 あなたがやろうとしていることに応じて、それは多かれ少なかれ難しいでしょう。 ArrayFieldカスタムルックアップをサポートすることは、かなり簡単です。

class CharArrayFilter(filters.BaseCSVFilter, filters.CharFilter):
     pass

class MyFilterSet(filters.FilterSet):
    tags__contains = CharArrayFilter(name='tags', lookup_expr='contains')

    class Meta:
        model = SomethingTaggable
GET http://localhost/api/something-taggable?tags__contains=a,b,c

上記のフィルターは、コンマ区切りの入力を検証し、基になる.filter()呼び出しに適したクリーンな値のリストを返します。

一方、構造化されておらず、理論的には無限の組み合わせを持つインデックス変換とスライス変換を処理するのは少し複雑です。

全てのコメント4件

django-filterには現在、postgrescontribフィールドと互換性のあるフィルターがありません。独自のフィルターを作成する必要があります。 あなたがやろうとしていることに応じて、それは多かれ少なかれ難しいでしょう。 ArrayFieldカスタムルックアップをサポートすることは、かなり簡単です。

class CharArrayFilter(filters.BaseCSVFilter, filters.CharFilter):
     pass

class MyFilterSet(filters.FilterSet):
    tags__contains = CharArrayFilter(name='tags', lookup_expr='contains')

    class Meta:
        model = SomethingTaggable
GET http://localhost/api/something-taggable?tags__contains=a,b,c

上記のフィルターは、コンマ区切りの入力を検証し、基になる.filter()呼び出しに適したクリーンな値のリストを返します。

一方、構造化されておらず、理論的には無限の組み合わせを持つインデックス変換とスライス変換を処理するのは少し複雑です。

情報をありがとう。

とりあえず、これを範囲外として閉じます。 文書化され、テストされたプルリクエストを検討してください。 将来的には再考する可能性があります。

アップデート:
パラメータnamefield_name名前が変更されたため、 MyFilterSetは次のようになります。

class MyFilterSet(filters.FilterSet):
    tags__contains = CharArrayFilter(field_name='tags', lookup_expr='contains')

    class Meta:
        model = SomethingTaggable
このページは役に立ちましたか?
0 / 5 - 0 評価