我正在使用Django REST框架,我有一个像这样的配置:
router.register(r'foo', FooViewSet)
router.register(r'foo-mini', MinFooViewSet)
FooViewSet
和MinFooViewSet
完全相同(“min”hones继承自前者),使用相同的queryset
但只需更改serializer_class
。
MinFooViewSet
使用的序列化程序类返回来自同一模型的较少字段。
我有一种奇怪的行为(可能标准,但我不明白):似乎每个模型我只能有一条路线。事实上,生成的API索引如下所示:
"foo": "http://localhost:8001/api/v1/foo-mini",
"foo-mini": "http://localhost:8001/api/v1/foo-mini",
因此两个端点都指向使用最后一个(MinFooViewSet
)配置的相同URL。
我缺少什么?
答案 0 :(得分:1)
根据您的要求,您似乎需要使api成为通用的,但它应该根据某些条件(例如mini)具有不同的行为,这应该按照const languages = Array.from(new Set(
[].concat(...this.countries.map(country => country.languages))
));
返回一些其他数据,因此下面提到的机制提供您可以根据某些条件选择任何序列化程序类。
返回应该用于序列化程序的类。默认返回serializer_class属性。
可以重写以提供动态行为,例如使用不同的序列化程序进行读写操作,或者为不同类型的用户提供不同的序列化程序。
例如:
FooMiniSerializer
我建议您只保留一个api url和一个视图集,然后您可以使用def get_serializer_class(self):
if self.request.user.is_staff:
return FullAccountSerializer
return BasicAccountSerializer
方法有条件地选择任何序列化程序。
希望这会对你有所帮助。
答案 1 :(得分:0)
使用base_name =“某物”
router.register(r'foo', FooViewSet,base_name='foo')
router.register(r'foo-mini', MinFooViewSet,base_name='foo_mini')