0%

Django-Rest-Framework-ViewSet-路由与请求方法映射全解

Django Rest Framework ViewSet 路由与请求方法映射全解

1. ViewSet 与 HTTP 请求方法对应关系

URL 形式 HTTP 方法 ViewSet 方法 说明
/incomes/ GET IncomeViewSet.list() 获取收入列表
/incomes/ POST IncomeViewSet.create() 新增一条收入记录
/incomes/{pk}/ GET IncomeViewSet.retrieve() 获取指定 pk 的收入详情
/incomes/{pk}/ PUT IncomeViewSet.update() 完整更新指定 pk 的收入记录
/incomes/{pk}/ PATCH IncomeViewSet.partial_update() 局部更新指定 pk 的收入记录
/incomes/{pk}/ DELETE IncomeViewSet.destroy() 删除指定 pk 的收入记录

2. 示例代码

ViewSet 实现:

from rest_framework import viewsets, permissions
from rest_framework.response import Response

class IncomeViewSet(viewsets.ViewSet):
permission_classes = [permissions.IsAuthenticated] # 需要登录权限

def list(self, request):
# GET /incomes/
return Response({'msg': '返回收入列表'})

def create(self, request):
# POST /incomes/
return Response({'msg': '新增收入记录'})

def retrieve(self, request, pk=None):
# GET /incomes/{pk}/
return Response({'msg': f'返回收入 {pk} 的详情'})

def update(self, request, pk=None):
# PUT /incomes/{pk}/
return Response({'msg': f'完全更新收入 {pk}'})

def partial_update(self, request, pk=None):
# PATCH /incomes/{pk}/
return Response({'msg': f'局部更新收入 {pk}'})

def destroy(self, request, pk=None):
# DELETE /incomes/{pk}/
return Response({'msg': f'删除收入 {pk}'})

路由注册(urls.py):

from rest_framework.routers import DefaultRouter
from django.urls import path, include
from .views import IncomeViewSet

router = DefaultRouter()
router.register(r'incomes', IncomeViewSet, basename='income')

urlpatterns = [
path('', include(router.urls)),
]

3. 请求示例与函数对应

3.1 获取收入列表

curl -X GET http://localhost:8000/incomes/

→ 调用 IncomeViewSet.list()

3.2 新增一条收入记录

bash


复制编辑
curl -X POST http://localhost:8000/incomes/ -d '{"amount": 1000}' -H "Content-Type: application/json"

→ 调用 IncomeViewSet.create()

3.3 获取某个收入详情

curl -X GET http://localhost:8000/incomes/5/

→ 调用 IncomeViewSet.retrieve(pk=5)

3.4 完整更新收入记录

curl -X PUT http://localhost:8000/incomes/5/ -d '{"amount": 2000}' -H "Content-Type: application/json"

→ 调用 IncomeViewSet.update(pk=5)

3.5 局部更新收入记录

curl -X PATCH http://localhost:8000/incomes/5/ -d '{"amount": 1500}' -H "Content-Type: application/json"

→ 调用 IncomeViewSet.partial_update(pk=5)

3.6 删除收入记录

curl -X DELETE http://localhost:8000/incomes/5/

→ 调用 IncomeViewSet.destroy(pk=5)


4. 逻辑总结

  • DRF Router 会根据 URL 和 HTTP Method 自动匹配 ViewSet 里的对应方法。
  • /incomes/ 不带 pk → GET 时调用 list(),POST 时调用 create()
  • /incomes/{pk}/ 带 pk → GET 时调用 retrieve(),PUT 调用 update(),PATCH 调用 partial_update(),DELETE 调用 destroy()

5. 备注

  • ViewSet 默认只支持上面这几种标准方法。
  • 如果你需要额外的动作(如 /incomes/{pk}/approve/),需要用 @action 装饰器单独声明。
  • HEAD / OPTIONS 请求 DRF 会自动响应,无需编写代码。