Skip to content

DRF 视图集

ViewSet

DRF 的视图集可快速实现请求响应处理以及数据的 CRUD 操作,比原生 Django 的视图更简洁

建议定义在自定义应用目录下替代原生 Django 的视图

[项目目录]
├─ manage.py

├─ [主应用]/
│   └─ ...

└─ [自定义应用名]/
    ├─ ...
    └─ views/
       ├─ __init__.py
       ├─ [视图集1].py
       ├─ [视图集2].py
       └─ ...

创建

视图集是个类,自定义视图集类通常命名为模型名ViewSet

自定义视图集类需要从viewsets中继承所需的内置视图集类

内置视图集类也继承有不同的 内置视图类 并提供指定 HTTP 请求的处理方法

py
from rest_framework import viewsets
from .models import 自定义模型类
from .serializers import 自定义序列化器类


class 自定义视图集类(viewsets.内置视图集类):
    queryset = 自定义模型类.objects.all()
    serializer_class = 自定义序列化器类
常用内置视图集类继承的内置视图类说明
ViewSetAPIView仅作为视图基类不提供请 CRUD 操作
ReadOnlyModelViewSetGenericAPIView仅提供可读的 GET 请求处理
ModelViewSetGenericViewSet
mixins.CreateModelMixin
mixins.RetrieveModelMixin
mixins.UpdateModelMixin
mixins.DestroyModelMixin
mixins.ListModelMixin
提供了基于模型的完整 CRUD 操作

重写请求处理

可通过重写覆盖继承自内置视图集类的方法,来实现自定义请求处理方法的逻辑

py
from rest_framework import viewsets
from .models import 自定义模型类
from .serializers import 自定义序列化器类


class 自定义视图集类(viewsets.内置视图集类):
    queryset = 自定义模型类.objects.all()
    serializer_class = 自定义序列化器类

    # 重写覆盖 GET 请求列表
    # --------------------------------------------------------------------------------
    def list(self, request, *args, **kwargs):
        response = super().list(request, *args, **kwargs)
        return response

    # 重写覆盖 GET 请求单个资源
    # --------------------------------------------------------------------------------
    def retrieve(self, request, *args, **kwargs):
        response = super().retrieve(request, *args, **kwargs)
        return response

    # 重写覆盖 POST 请求创建资源
    # --------------------------------------------------------------------------------
    def create(self, request, *args, **kwargs):
        response = super().create(request, *args, **kwargs)
        return response

    # 重写覆盖 PUT 请求更新资源
    # --------------------------------------------------------------------------------
    def update(self, request, *args, **kwargs):
        response = super().update(request, *args, **kwargs)
        return response

    # 重写覆盖 PATCH 请求部分更新
    # --------------------------------------------------------------------------------
    def partial_update(self, request, *args, **kwargs):
        response = super().partial_update(request, *args, **kwargs)
        return response

    # 重写覆盖 DELETE 请求删除资源
    # --------------------------------------------------------------------------------
    def destroy(self, request, *args, **kwargs):
        response = super().destroy(request, *args, **kwargs)
        return response

内置视图类

DRF 提供了很多内置视图类来简化原生 Django 视图中的对 HTTP 请求的处理

创建视图时一般需要直接继承使用 内置视图集

因为内置视图集已经继承了内置视图类没有必要额外单独使用内置视图类

常见内置视图类说明
views.APIViewDRF 的基础类,接近原生 Django 的 View
generics.ListAPIView提供一个请求列表的 GET 请求的处理方法
generics.RetrieveAPIView提供一个请求单个资源的 GET 请求的处理方法
generics.CreateAPIView提供一个创建资源的 POST 请求的处理方法
generics.UpdateAPIView提供一个更新资源的 PUT 请求的处理方法
generics.DestroyAPIView提供一个删除资源的 DELETE 请求的处理方法