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

如何在Django REST Framework中配置两个ViewSet的嵌套URL?

实现嵌套评论路由的两种方案

方案一:使用rest_framework_nested实现嵌套路由(推荐)

这种方式符合DRF的路由规范,配置更简洁。

  1. 先安装依赖:
pip install django-rest-framework-nested
  1. 在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)),
]
  1. 修改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逻辑:

  1. 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'),
]
  1. 同样需要修改CommentViewSet的get_queryset和perform_create方法,代码与方案一完全一致,确保评论和文章正确关联。

注意事项

  • 确保Comment模型中存在article外键字段,关联到Article模型,否则无法实现关联逻辑。
  • 方案一中的basename='article-comments'用于生成唯一的URL名称,避免与其他路由冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:05:10