如何使用django-filters重命名(在API中公开)过滤器字段名称?

Tom*_*iak 6 python django rest django-filter

正如问题所述 - 我正在尝试重命名我的API中公开的过滤器字段名称.

我有以下型号:

class Championship(Model):
    ...

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

class Match(Model):
    group = ForeignKey(Group, ...)
Run Code Online (Sandbox Code Playgroud)

我在REST API中公开了所有这些模型.我filter_fieldsMatch模型定义了:

class MatchViewSet(ModelViewSet):
    filter_fields = ['group__championship']
    ...
Run Code Online (Sandbox Code Playgroud)

这样,我可以过滤特定锦标赛的比赛(测试和工作):

curl/api/matches /?group__championship = 1

是否可以为暴露的过滤器使用某种别名,以便我可以使用以下内容:

curl/api/matches /?championship = 1

其中,championship在这种情况下将是一个别名group__championship

pip freeze 收益:

django-filter==0.15.2
(...)
Run Code Online (Sandbox Code Playgroud)

我也试着实现自定义FilterSetModelChoiceFilter和自定义查询方法:

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']
Run Code Online (Sandbox Code Playgroud)

有了观点:

class MatchViewSet(ModelViewSet):
    filter = MatchFilterSet
    (...)
Run Code Online (Sandbox Code Playgroud)

但没有运气.filter_championship甚至从未调用该方法.

Nar*_*esh 8

您需要在字段类型的django_filters中提供模型字段作为名称.我正在考虑你试图按冠军头衔过滤.

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

    class Meta:
        model = Match
        fields = ['championship']
Run Code Online (Sandbox Code Playgroud)


Tom*_*iak 6

经过Naresh 的回复,我已经找出了错误的根源。

这是模型视图的实现:

class MatchViewSet(ModelViewSet):
    filter = MatchFilterSet
    (...)
Run Code Online (Sandbox Code Playgroud)

因为django-filter它应该是filter_class而不是filter,所以正确的实现是:

class MatchViewSet(ModelViewSet):
    filter_class = MatchFilterSet
    (...)
Run Code Online (Sandbox Code Playgroud)

此外,我还更改了模型过滤器的实现,使其更像 Naresh 建议的那样:

class MatchFilterSet(FilterSet):
    championship = NumberFilter(field_name='group__championship')

    class Meta:
        model = Match
        fields = ['championship']
Run Code Online (Sandbox Code Playgroud)

上面和Naresh的区别在于运气部分_id是不必要的。

经过这些更改后,一切正常。