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): return Response({'msg': '返回收入列表'})
def create(self, request): return Response({'msg': '新增收入记录'})
def retrieve(self, request, pk=None): return Response({'msg': f'返回收入 {pk} 的详情'})
def update(self, request, pk=None): return Response({'msg': f'完全更新收入 {pk}'})
def partial_update(self, request, pk=None): return Response({'msg': f'局部更新收入 {pk}'})
def destroy(self, request, pk=None): 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 会自动响应,无需编写代码。