正如问题所述 - 我试图重命名我的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
方法甚至从未被调用过。
答案 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
部分的运气,这是不必要的。
在这些改变之后一切正常。