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

在Django REST Framework中如何将同路径不同请求类型映射到不同视图?

实现方案

你完全可以实现同一路由根据不同请求方法映射到不同处理函数,这里提供两种符合你需求的常用实现方式:


方案1:轻量方法分发函数(无额外依赖,无需修改现有业务代码)

你不需要把业务逻辑揉在同一个函数里,只需要写一个无业务逻辑的纯分发函数,把不同请求方法对应到你已经写好的三个视图即可:

  1. 先修正你现有视图的小问题:@api_view装饰器需要传入列表类型的请求方法参数,你当前写的@api_view('GET')会报错,调整为:
# 修正后的装饰器
@api_view(['GET'])
def get_instrument_by_id(request:HttpRequest, id):
    # 原有业务逻辑不变
    ...

@api_view(['POST'])
def update_instrument_by_id(request:HttpRequest, id):
    # 原有业务逻辑不变
    ...

@api_view(['DELETE'])
def delete_instrument_by_id(request:HttpRequest, id):
    # 原有业务逻辑不变
    ...
  1. 新增纯分发视图,不需要编写任何业务逻辑:
@api_view(['GET', 'POST', 'DELETE'])
def instrument_id_dispatcher(request, id):
    # 仅做请求方法到对应处理函数的映射
    method_map = {
        'GET': get_instrument_by_id,
        'POST': update_instrument_by_id,
        'DELETE': delete_instrument_by_id
    }
    return method_map[request.method](request, id)
  1. 在你的urls.py中绑定路由即可:
from django.urls import path
from .views import instrument_id_dispatcher

urlpatterns = [
    # 其他路由...
    path('api/instrument/<int:id>/', instrument_id_dispatcher),
]

方案2:基于DRF类视图的实现(更符合DRF生态的规范写法)

如果你习惯用类视图,也可以用DRF的APIView做方法映射,不用修改现有业务函数:

from rest_framework.views import APIView

class InstrumentByIdView(APIView):
    def get(self, request, id):
        return get_instrument_by_id(request, id)
    
    def post(self, request, id):
        return update_instrument_by_id(request, id)
    
    def delete(self, request, id):
        return delete_instrument_by_id(request, id)

路由绑定改为:

path('api/instrument/<int:id>/', InstrumentByIdView.as_view()),

额外说明

Django原生路由默认没有请求方法的匹配规则,是因为Django的FBV默认支持所有请求方法,需要通过require_http_methods装饰器或者DRF的@api_view装饰器做方法限制。两种方案都可以实现你要求的「业务逻辑拆分到不同函数,不用在单函数内做方法分支判断」的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:15:08