2016-10-12 21 views
2

質問として、私はAPIで公開されているフィルタフィールド名の名前を変更しようとしています。django-filtersを使用してフィルタフィールド名を変更する方法(APIで公開)

私は、次のモデルがあります:

class Championship(Model): 
    ... 

class Group(Model): 
    championship = ForeignKey(Championship, ...) 

class Match(Model): 
    group = ForeignKey(Group, ...) 

私はREST APIでこれらのモデルのすべてを暴露しています。私はMatchモデルのfilter_fieldsを定義しました:?

カール/ API /マッチ/ group__championship = 1

この方法では、私は特定のチャンピオンシップの試合(テストや作業)をフィルタリングすることができます

されていますが、私は次のように使用できるようにさらさフィルタのエイリアスのいくつかの種類を使用することが可能である:

カール/ API /一致/?この場合championshipgroup__championshipのエイリアスになり優勝= 1

pip freezeリターン:ビューで

class MatchFilterSet(FilterSet): 
    championship = ModelChoiceFilter(method='filter_championship') 

    def filter_championship(self, queryset, name, value): 
     return queryset.filter(group__championship=value) 

    class Meta: 
     model = Match 
     fields = ['championship'] 

class MatchViewSet(ModelViewSet): 
    filter = MatchFilterSet 
    (...) 

しかし運と

django-filter==0.15.2 
(...) 

私もModelChoiceFilterとカスタムFilterSetとカスタム検索メソッドを実装しようとしました。 filter_championshipメソッドも呼び出されませんでした。

答えて

1

Nareshの回答後、私はエラーの原因を突き止めました。

それは、モデルのビューの実装でした。また

class MatchViewSet(ModelViewSet): 
    filter_class = MatchFilterSet 
    (...) 

、私は変更した:正しい実装があるので、それはfilter_classいうよりfilterあるべきdjango-filterについて

class MatchViewSet(ModelViewSet): 
    filter = MatchFilterSet 
    (...) 

Nareshのようにモデルのフィルタの実装を提案した:

上記とナレシのものの違いは、必ずしも必要でない_id部分の運です。

これらの変更の後、すべて正常に動作します。

4

フィールド型のdjango_filtersでモデルフィールドを名前として指定する必要があります。私はあなたがチャンピオンシップidでフィルタリングしようとしていると考えています。

class MatchFilterSet(FilterSet): 
    championship = django_filters.NumberFilter(name='group__championship_id') 

    class Meta: 
     model = Match 
     fields = ['championship'] 
関連する問題