如何修改Django Rest Framework(DRF)路由URL前缀以传递双查询字段
Django DRF 博客评论路由配置解决方案
你的现有写法存在错误:DRF 内置的 SimpleRouter 不支持直接在 register 方法的前缀参数中写入 <int:id> 这类路径参数,因此无法正确解析传递博客ID。你可以选择以下两种方案调整:
方案1:手动补充评论路由(无额外依赖)
直接修改urls.py内容如下:
from django.urls import path, include from rest_framework.routers import SimpleRouter from .views import BlogViewSet, CommentViewSet router = SimpleRouter() router.register('blog', BlogViewSet, basename='blog') router.register('comments', CommentViewSet, basename='comments') urlpatterns = [ # 自定义带博客ID的评论路由 path('blog/<int:blog_id>/comments/', CommentViewSet.as_view({'get': 'list', 'post': 'create'}), name='blog-comments-list'), path('blog/<int:blog_id>/comments/<int:pk>/', CommentViewSet.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}), name='blog-comments-detail'), path('', include(router.urls)), ]
后续在CommentViewSet中可通过self.kwargs['blog_id']获取当前请求对应的博客ID,过滤关联的评论数据即可。
方案2:嵌套路由实现(符合RESTful规范)
先执行pip install drf-nested-routers安装嵌套路由扩展,再修改urls.py内容如下:
from django.urls import path, include from rest_framework_nested import routers from .views import BlogViewSet, CommentViewSet # 一级路由:博客资源 router = routers.SimpleRouter() router.register('blog', BlogViewSet, basename='blog') # 二级嵌套路由:对应博客下的评论资源 blog_router = routers.NestedSimpleRouter(router, 'blog', lookup='blog') blog_router.register('comments', CommentViewSet, basename='blog-comments') urlpatterns = [ path('', include(router.urls)), path('', include(blog_router.urls)), ]
该方案会自动生成标准的RESTful路径,可在CommentViewSet中通过self.kwargs['blog_pk']获取博客ID。
内容的提问来源于stack exchange,提问作者Põyã Shadman
相关产品推荐
相关产品推荐

