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

如何将两个ViewSet关联到单个Django URL,实现指定请求方法映射?

解决方法

你遇到的问题是Django路由按顺序匹配,同路径的路由只会触发第一个,所以得给批量更新的视图加上请求方法限制,让它只处理根路径的PATCH请求,其他请求交给后续的ViewSet路由。

修改urls.py代码如下:

from rest_framework import routers
from django.urls import path, include
from .views import ResourceViewSet, BulkResourceUpdateViewSet

router = routers.SimpleRouter()
router.register("", ResourceViewSet, basename="resource")

urlpatterns = [
    # 仅响应根路径的PATCH请求
    path(
        "",
        BulkResourceUpdateViewSet.as_view(methods=["patch"]),
        name="bulk-resource-update",
    ),
    # 处理剩余请求:根路径的GET/POST、带pk的所有CRUD操作
    path(
        "",
        include(router.urls),
        name="basic-resource-crud",
    ),
]

说明

  • DRF的as_view()支持传入methods参数,用来限定视图仅处理指定的HTTP方法。这样这个路由不会拦截GET/POST等其他请求,只会处理PATCH。
  • 后续的include(router.urls)会接管剩下的请求:根路径的列表查询(GET)、创建资源(POST),以及带<pk>的详情查询、单条更新、删除等操作。

另外确保你的BulkResourceUpdateViewSet只实现patch方法,避免方法冲突,示例如下:

from rest_framework.views import APIView
from rest_framework.response import Response

class BulkResourceUpdateViewSet(APIView):
    def patch(self, request):
        # 在这里实现批量更新逻辑
        # 例如批量筛选资源、更新字段等
        return Response({"status": "ok", "msg": "批量更新完成"})

这样就能完全实现你要的URL结构:

  • GET / → ResourceViewSet的列表接口
  • PATCH / → 批量更新接口
  • GET /<pk>/ → ResourceViewSet的详情接口
  • PUT /<pk>/ → ResourceViewSet的全量更新接口
  • PATCH /<pk>/ → ResourceViewSet的局部更新接口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:02:34