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

时间:2016-10-12 07:09:03

标签: python django rest django-filter

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

我有以下型号:

class Championship(Model):
    ...

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

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

我在REST API中公开了所有这些模型。我为filter_fields模型定义了Match

class MatchViewSet(ModelViewSet):
    filter_fields = ['group__championship']
    ...

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

  

curl / api / matches /?group__championship = 1

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

  

curl / api / matches /?championship = 1

在这种情况下,championship将是group__championship的别名?

pip freeze返回:

django-filter==0.15.2
(...)

我还尝试使用FilterSet和自定义查找方法实施自定义ModelChoiceFilter

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
    (...)

但没有运气。 filter_championship方法甚至从未被调用过。

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

Naresh回复后,我发现了错误来源。

这是模型视图的实现:

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

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

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

另外,我已经将模型过滤器的实现更改为更像Naresh建议:

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

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

上面和Naresh之间的差异是_id部分的运气,这是不必要的。

在这些改变之后一切正常。