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

如何在drf-nested-routers嵌套路由中统一lookup_url_kwarg命名

如何在drf-nested-routers中统一嵌套路由的参数命名(将maildrop的pk改为maildrop_pk)

要实现将/clients/{client_pk}/maildrops/{pk}/改为/clients/{client_pk}/maildrops/{maildrop_pk}/,同时保证后续嵌套的recipients路由参数正常,需要同时修改路由注册代码和MailDropViewSet的配置:

  1. 在注册maildrops到client_router时,添加lookup='maildrop'参数,让drf-nested-routers生成maildrop_pk作为该层级的URL参数名。
  2. 在MailDropViewSet中设置lookup_url_kwarg = 'maildrop_pk',让视图集从URL中正确获取这个参数作为主键查询依据。

修改后的完整urls.py代码

# urls.py
router = DefaultRouter()
router.register(r'clients', ClientViewSet, basename='clients')
## 生成:
# /clients/
# /clients/{pk}/

client_router = routers.NestedSimpleRouter(router, r'clients', lookup='client')
# 注册maildrops时添加lookup='maildrop',指定参数名为maildrop_pk
client_router.register(r'maildrops', MailDropViewSet, basename='maildrops', lookup='maildrop')
## 生成:
# /clients/{client_pk}/maildrops/
# /clients/{client_pk}/maildrops/{maildrop_pk}/

maildrops_router = routers.NestedSimpleRouter(client_router, r'maildrops', lookup='maildrop')
maildrops_router.register(r'recipients', MailRecipientViewSet, basename='recipients')
## 生成:
# /clients/{client_pk}/maildrops/{maildrop_pk}/recipients/
# /clients/{client_pk}/maildrops/{maildrop_pk}/recipients/{pk}/

urlpatterns = [
    path(r'', include(router.urls)),
    path(r'', include(client_router.urls)),
    path(r'', include(maildrops_router.urls)),
]

修改后的MailDropViewSet代码

# views.py
class MailDropViewSet(viewsets.ModelViewSet):
    queryset = MailDrop.objects.all()
    serializer_class = MailDropSerializer
    # 指定从URL的maildrop_pk参数获取主键
    lookup_url_kwarg = 'maildrop_pk'

为什么之前的配置会出问题?

之前直接在MailDropViewSet中设置lookup_url_kwarg = "maildrop_pk"导致参数变成{maildrop_maildrop_pk},是因为maildrops_router的lookup='maildrop'会自动将父路由的参数名拼接为{lookup}_pk,而当时client_router生成的maildrop参数还是默认的pk,叠加后就出现了重复命名。

现在通过在client_router注册maildrops时指定lookup='maildrop',让该层级的参数直接变为maildrop_pk,同时视图集通过lookup_url_kwarg绑定这个参数,既统一了路由命名,也保证了后续嵌套的recipients路由能正确识别父级参数。

内容的提问来源于stack exchange,提问作者cezar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:04:55