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_fields
为Match
模型定义了:
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)
我也试着实现自定义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']
Run Code Online (Sandbox Code Playgroud)
有了观点:
class MatchViewSet(ModelViewSet):
filter = MatchFilterSet
(...)
Run Code Online (Sandbox Code Playgroud)
但没有运气.filter_championship
甚至从未调用该方法.
您需要在字段类型的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)
经过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
是不必要的。
经过这些更改后,一切正常。
归档时间: |
|
查看次数: |
1656 次 |
最近记录: |