如何在Django REST Framework中配置两个ViewSet的嵌套URL?
实现嵌套评论路由的两种方案
方案一:使用rest_framework_nested实现嵌套路由(推荐)
这种方式符合DRF的路由规范,配置更简洁。
- 先安装依赖:
pip install django-rest-framework-nested
- 在
urls.py中配置路由:
from django.urls import path, include from rest_framework import routers from rest_framework_nested import routers as nested_routers from .views import ArticleViewSet, CommentViewSet # 根路由注册文章视图 router = routers.DefaultRouter() router.register(r'article', ArticleViewSet) # 基于文章路由生成评论的嵌套子路由 article_router = nested_routers.NestedSimpleRouter(router, r'article', lookup='article') article_router.register(r'comments', CommentViewSet, basename='article-comments') urlpatterns = [ path('', include(router.urls)), path('', include(article_router.urls)), ]
- 修改
CommentViewSet,关联父文章资源:
from rest_framework import viewsets from .models import Article, Comment from .serializers import ArticleSerializer, CommentSerializer from rest_framework.permissions import IsAuthenticated class CommentViewSet(viewsets.ModelViewSet): serializer_class = CommentSerializer permission_classes = [IsAuthenticated] def get_queryset(self): # 过滤出当前文章下的所有评论 return Comment.objects.filter(article_id=self.kwargs['article_id']) def perform_create(self, serializer): # 创建评论时自动关联对应文章 article = Article.objects.get(id=self.kwargs['article_id']) serializer.save(article=article)
配置完成后,会生成你需要的URL规则:
POST /article/{article_id}/comments/:给指定文章添加评论DELETE /article/{article_id}/comments/{comment_id}/:删除指定文章下的目标评论
同时还支持GET获取文章评论列表、PUT/PATCH修改评论等标准REST动作。
方案二:手动配置URL(无需第三方库)
如果不想依赖第三方库,可以手动编写URL规则,同时修改ViewSet逻辑:
urls.py配置:
from django.urls import path from .views import ArticleViewSet, CommentViewSet from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r'article', ArticleViewSet) urlpatterns = [ path('', include(router.urls)), # 手动注册评论列表路由 path('article/<int:article_id>/comments/', CommentViewSet.as_view({ 'get': 'list', 'post': 'create' }), name='article-comments-list'), # 手动注册评论详情路由 path('article/<int:article_id>/comments/<int:pk>/', CommentViewSet.as_view({ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }), name='article-comments-detail'), ]
- 同样需要修改
CommentViewSet的get_queryset和perform_create方法,代码与方案一完全一致,确保评论和文章正确关联。
注意事项
- 确保
Comment模型中存在article外键字段,关联到Article模型,否则无法实现关联逻辑。 - 方案一中的
basename='article-comments'用于生成唯一的URL名称,避免与其他路由冲突。
内容的提问来源于stack exchange,提问作者NotTooFast
相关产品推荐
相关产品推荐

