为继承相同模型的两个不同视图集注册路由

时间:2017-05-25 10:02:03

标签: django django-rest-framework

我正在使用Django REST框架,我有一个像这样的配置:

router.register(r'foo', FooViewSet)
router.register(r'foo-mini', MinFooViewSet)

FooViewSetMinFooViewSet完全相同(“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。

我缺少什么?

2 个答案:

答案 0 :(得分:1)

根据您的要求,您似乎需要使api成为通用的,但它应该根据某些条件(例如mini)具有不同的行为,这应该按照const languages = Array.from(new Set( [].concat(...this.countries.map(country => country.languages)) )); 返回一些其他数据,因此下面提到的机制提供您可以根据某些条件选择任何序列化程序类。

get_serializer_class(self)

返回应该用于序列化程序的类。默认返回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')