如何在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的配置:
- 在注册maildrops到client_router时,添加
lookup='maildrop'参数,让drf-nested-routers生成maildrop_pk作为该层级的URL参数名。 - 在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
相关产品推荐
相关产品推荐

