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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:41:10