如何将两个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
相关产品推荐
相关产品推荐

