DRF中含pk的嵌套路由配置失效,如何正确定义?
DRF嵌套路由配置问题及解决方案
问题场景
在DRF项目中配置了以下路由,期望实现对Note模型的GET、POST、PUT、DELETE等操作,但当前路由配置无法生效:
router.register(r'user', views.UserView, basename='user') router.register(r'user/{pk}/note', views.NoteView, basename='user')
对应的NoteView代码如下:
class NoteView(ModelViewSet, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin): filter_backends = [DjangoFilterBackend] def get_queryset(self): return Note.objects.all() def list(self, request, *args, **kwargs): ... def create(self, request, *args, **kwargs): ... def update(self, request, *args, **kwargs): ... def destroy(self, request, *args, **kwargs): ... def get_serializer_class(self): if self.action == 'list': return NoteListSerializer return NoteSerializer
解决方案
DRF的DefaultRouter不支持直接编写user/{pk}/note格式的路由,需通过嵌套路由注册的方式实现:先注册父级用户路由,再通过父路由返回的注册对象添加子级笔记路由,同时指定parents_query_lookups参数关联父模型的主键。
正确的路由配置代码:
user_router = router.register(r'user', views.UserView, basename='user') user_router.register(r'note', views.NoteView, basename='note', parents_query_lookups=['pk'])
注意:
- 子路由的
basename需设置为note,避免与父路由的basename冲突,同时与对应模型匹配 parents_query_lookups参数用于指定父模型的查询关联字段,此处['pk']表示将父模型User的主键作为Note模型的关联查询条件
内容的提问来源于stack exchange,提问作者Evgeniia
相关产品推荐
相关产品推荐

