DRF快速构建RESTful API指南
from .models import YourModel # 导入你的模型fields = "__all__" # 或指定需要的字段,如 ["id", "name", "is_available"]通过继承,并指定queryset(查询集)和# views.pyfrom .models import YourModel # 导入你的模型from .serializers import YourM
在 Django REST Framework (DRF) 中,viewsets.ModelViewSet 是一个预定义的视图集类,它整合了常见的 CRUD(创建、读取、更新、删除)操作的逻辑,允许你通过极少的代码快速实现一个完整的 RESTful API 端点。
核心特点
-
继承关系
ModelViewSet继承了GenericViewSet并混入了 5 个常用的动作类(ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestroyModelMixin),因此自带以下 6 个核心 API 动作:list():获取资源列表(GET 请求)retrieve():获取单个资源详情(GET 请求,带 ID)create():创建新资源(POST 请求)update():全量更新资源(PUT 请求,带 ID)partial_update():部分更新资源(PATCH 请求,带 ID)destroy():删除资源(DELETE 请求,带 ID)
-
使用场景
当你需要为一个 Django 模型(Model)提供完整的 CRUD 接口时,ModelViewSet是最简洁的选择。例如,为UserInfo模型提供用户管理接口、为Organization模型提供机构管理接口等。
基本用法
步骤 1:定义序列化器(Serializer)
首先需要为模型定义一个序列化器,用于数据的序列化(模型→JSON)和反序列化(JSON→模型):
# serializers.py
from rest_framework import serializers
from .models import YourModel # 导入你的模型
class YourModelSerializer(serializers.ModelSerializer):
class Meta:
model = YourModel
fields = "__all__" # 或指定需要的字段,如 ["id", "name", "is_available"]
步骤 2:定义 ViewSet
通过继承 ModelViewSet,并指定 queryset(查询集)和 serializer_class(序列化器),即可快速实现完整的 API 接口:
# views.py
from rest_framework import viewsets
from .models import YourModel # 导入你的模型
from .serializers import YourModelSerializer # 导入你的序列化器
class YourModelViewSet(viewsets.ModelViewSet):
# 指定查询集:获取所有数据(可自定义过滤、排序等)
queryset = YourModel.objects.all()
# 指定序列化器
serializer_class = YourModelSerializer
步骤 3:注册路由
在 urls.py 中通过 DefaultRouter 注册 ViewSet,自动生成对应的 URL 路由:
# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import YourModelViewSet
# 创建路由器并注册视图集
router = DefaultRouter()
router.register(r'your-models', YourModelViewSet) # 路由前缀为 your-models
# 包含自动生成的路由
urlpatterns = [
path('api/', include(router.urls)), # 最终接口路径为 /api/your-models/
]
自动生成的 API 端点
完成上述配置后,会自动生成以下 6 个 API 端点:
| 请求方法 | 路径 | 对应动作 | 说明 |
|---|---|---|---|
| GET | /api/your-models/ |
list() |
获取所有资源列表 |
| GET | /api/your-models/1/ |
retrieve() |
获取 ID=1 的资源详情 |
| POST | /api/your-models/ |
create() |
创建新资源(提交 JSON 数据) |
| PUT | /api/your-models/1/ |
update() |
全量更新 ID=1 的资源 |
| PATCH | /api/your-models/1/ |
partial_update() |
部分更新 ID=1 的资源(只传需改字段) |
| DELETE | /api/your-models/1/ |
destroy() |
删除 ID=1 的资源 |
扩展与定制
ModelViewSet 支持灵活定制,例如:
-
过滤、排序、分页
通过配置filter_backends、pagination_class等属性实现:from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.pagination import PageNumberPagination class YourModelViewSet(viewsets.ModelViewSet): queryset = YourModel.objects.all() serializer_class = YourModelSerializer # 支持搜索和排序 filter_backends = [SearchFilter, OrderingFilter] search_fields = ['name'] # 可搜索的字段 ordering_fields = ['created_at'] # 可排序的字段 # 分页配置 pagination_class = PageNumberPagination -
自定义权限
通过permission_classes控制接口访问权限:from rest_framework.permissions import IsAuthenticated, IsAdminUser class YourModelViewSet(viewsets.ModelViewSet): # 仅登录用户可访问,管理员可修改 permission_classes = [IsAuthenticated] # 其他配置... -
新增自定义动作
通过@action装饰器添加额外的 API 动作:from rest_framework.decorators import action from rest_framework.response import Response class YourModelViewSet(viewsets.ModelViewSet): # 其他配置... @action(detail=True, methods=['post']) # detail=True 表示需要 ID 参数 def enable(self, request, pk=None): """自定义动作:启用某个资源""" obj = self.get_object() obj.is_available = 1 # 假设 1 代表启用 obj.save() return Response({"status": "enabled"})会生成新的端点:
POST /api/your-models/1/enable/(启用 ID=1 的资源)。
总结
viewsets.ModelViewSet 是 DRF 中高效开发 CRUD 接口的核心工具,它通过整合常用动作,大幅减少重复代码。实际开发中,你可以根据需求在其基础上扩展过滤、权限、自定义动作等功能,快速构建符合业务需求的 RESTful API。
更多推荐



所有评论(0)