在Django DRF中如何用同一URL按请求方法映射不同视图?
问题解答:Django Rest Framework同一URL绑定不同视图(按请求方法区分)
完全可行,而且不需要脱离DRF的原生功能,有两种常用方案:
方案一:创建组合视图类
直接新建一个同时继承ListAPIView和CreateAPIView的视图类,复用原有两个视图的自定义逻辑即可。因为ListAPIView天然处理GET请求,CreateAPIView处理POST请求,DRF会自动根据请求方法分发到对应的处理流程。
示例代码:
from rest_framework import generics from .models import MyObject from .serializers import MyObjectSerializer from .views import MyObjectListAPIView, MyObjectCreateAPIView class MyObjectListCreateAPIView(generics.ListAPIView, generics.CreateAPIView): queryset = MyObject.objects.all() serializer_class = MyObjectSerializer # 复用列表视图的自定义查询逻辑 def get_queryset(self): return MyObjectListAPIView.get_queryset(self) # 复用创建视图的自定义创建逻辑 def perform_create(self, serializer): MyObjectCreateAPIView.perform_create(self, serializer)
然后在URL配置中映射这个组合视图:
from django.urls import path from .views import MyObjectListCreateAPIView urlpatterns = [ path('myObjects/', MyObjectListCreateAPIView.as_view(), name='myobject-list-create'), ]
方案二:URL配置层直接分发请求
如果不想修改原有视图类,可以在URL配置中编写一个简单的分发函数,根据请求方法调用对应的视图:
示例代码:
from django.http import HttpRequest from rest_framework.views import APIView from .views import MyObjectListAPIView, MyObjectCreateAPIView def my_object_combined_view(request: HttpRequest, *args, **kwargs): if request.method == 'GET': return MyObjectListAPIView.as_view()(request, *args, **kwargs) elif request.method == 'POST': return MyObjectCreateAPIView.as_view()(request, *args, **kwargs) # 对其他请求方法返回405 Method Not Allowed return APIView.as_view()(request, *args, **kwargs)
URL配置:
from django.urls import path from .views import my_object_combined_view urlpatterns = [ path('myObjects/', my_object_combined_view, name='myobject-list-create'), ]
两种方案都完全基于DRF原生功能,不会脱离框架特性,且能完美实现你要的“同一URL按请求方法区分视图”的需求。
内容的提问来源于stack exchange,提问作者NiH
相关产品推荐
相关产品推荐

