Skip to content

视图集

DRF 视图集

介绍

视图集是 DRF 提供的一种高级视图抽象,它将 CRUD 操作组织到一个类中,通过路由自动生成 URL,减少代码冗余。视图集本质是视图类的集合,结合了Mixin类的功能,让 API 开发更高效。

  • 代码复用性高,减少样板代码
  • 自动生成路由,简化 URL 配置
  • 支持动作(action)扩展,自定义 API 端点

DRF视图集的类型

DRF 提供了3种视图集基类,从低到高封装程度递增:

  • ViewSet:基础视图集,继承自APIView,需手动实现 CRUD 方法。

    python
    from rest_framework import viewsets
    from rest_framework.response import Response
    
    class UserViewSet(viewsets.ViewSet):
        def list(self, request):
            return Response({"message": "List all users"})
  • GenericViewSet:继承自GenericAPIView,支持querysetserializer_class属性,但需手动添加Mixin类。

    python
    from rest_framework import mixins, viewsets
    
    class UserViewSet(mixins.ListModelMixin,
                      mixins.RetrieveModelMixin,
                      viewsets.GenericViewSet):
        queryset = User.objects.all()
        serializer_class = UserSerializer
  • ModelViewSet:最常用的视图集,继承所有Mixin类,提供完整的 CRUD 操作。

    python
    from rest_framework import viewsets
    
    class UserViewSet(viewsets.ModelViewSet):
        queryset = User.objects.all()
        serializer_class = UserSerializer

ModelViewSet生成的 URL 模式示例

HTTP 方法URL 路径对应视图方法功能
GET/users/list获取用户列表
POST/users/create创建用户
GET/users/{id}/retrieve获取单个用户
PUT/users/{id}/update完整更新用户
PATCH/users/{id}/partial_update部分更新用户
DELETE/users/{id}/destroy删除用户

自定义视图集

自定义Mixin类

文件mysite\mars_framework\viewsets\mixins.py,定义了下面Mixin

Mixin类名称主要方法功能
CustomCreateModelMixincreate()新增
CustomDestroyModelMixindestroy()删除
CustomUpdateModelMixinupdate()修改
CustomRetrieveModelMixinretrieve()查询详情
CustomListModelMixinlist()查询列表
ListSimpleModelMixinlist_simple()查询列表简要信息
ExportModelMixinexport()导出数据

自定义视图集

文件mysite\mars_framework\viewsets\base.pyCustomGenericViewSet类继承了GenericViewSet

  • 重写了get_serializer_class()方法:可以为每个action指定序列化器
  • 重写了get_permissions()方法:可以为每个action指定权限
  • 重写了get_queryset()方法:可以为每个action指定查询集,并且实现数据权限过滤

image-20250623153756252

文件mysite\mars_framework\viewsets\base.py,还通过继承Mixin类,定义了几个视图集。

  • 在实际开发中,可以自由组合不同的Mixin类,实现不同的功能组合
  • 在实际开发中,也可以添加新的Mixin类,实现新的功能

image-20250623154134733