You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:57:16