DRF视图类选择与使用

在 Django REST Framework (DRF) 中,视图(Views) 扮演着协调请求、序列化器和模型之间交互的核心角色。它决定了如何处理请求(如数据校验、权限控制、业务逻辑),如何将数据传递给序列化器,以及如何将处理结果返回给客户端。以下是一个清晰的分类和选择指南:

一、视图的核心作用
处理 HTTP 请求
解析请求数据(如 GET, POST, PUT, DELETE),验证请求合法性。

协调序列化器和模型
调用序列化器将请求数据转换为模型实例(或反向操作),执行数据库的增删改查。

控制响应逻辑
返回格式化的响应(如 JSON),处理异常和错误。

附加功能
权限检查(如认证、限流)、分页、过滤等。

二、DRF 视图类层次结构
DRF 提供了多种视图类,按灵活性和封装程度从低到高排序:

APIView 
↓
GenericAPIView + Mixins(如 ListModelMixin)
↓
组合视图类(如 ListCreateAPIView)
↓
ViewSet(如 ModelViewSet)

三、如何选择视图类?

  1. 基础场景:完全自定义逻辑
    继承 APIView
    需要手动实现 get(), post(), put() 等方法,适合非标准操作或需要高度定制的逻辑。
from rest_framework.views import APIView
from rest_framework.response import Response

class UserDetailView(APIView):
    def get(self, request, pk):
        user = User.objects.get(pk=pk)
        serializer = UserSerializer(user)
        return Response(serializer.data)
  1. 通用场景:需要 CRUD 操作
    使用 GenericAPIView + Mixins
    组合 Mixin 类(如 ListModelMixin, CreateModelMixin)实现复用代码,适合标准 CRUD。
from rest_framework import generics, mixins

class BookListCreateView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

直接使用组合视图类
DRF 预置了 ListCreateAPIView, RetrieveUpdateDestroyAPIView 等,进一步简化代码。

class BookListCreateView(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
  1. 高级场景:需要路由简化
    使用 ViewSet 或 ModelViewSet
    将多个动作(如 list, create, retrieve)合并到一个类中,配合 Router 自动生成 URL 路由。
views
from rest_framework import viewsets

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
urls.py
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'users', UserViewSet)
urlpatterns = router.urls

四、决策流程图
根据需求选择视图类:

是否需要完全自定义逻辑?

├── 是 → 选择 APIView
└── 否 → 是否需要标准 CRUD 操作?
    ├── 是 → 是否需要自动路由?
    │   ├── 是 → 选择 ModelViewSet + Router
    │   └── 否 → 选择组合视图类(如 ListCreateAPIView)
    └── 否 → 混合使用 GenericAPIView + 特定 Mixins

五、最佳实践
简单 API:优先使用 ModelViewSet + Router,减少重复代码。

部分操作需定制:继承 GenericAPIView 并混入特定 Mixins。

非标准逻辑:直接继承 APIView,完全控制行为。

复用性:通过重写 get_queryset(), perform_create() 等方法添加业务逻辑。

通过理解视图的职责和各类的适用场景,可以高效选择最合适的 DRF 视图类。

你可能感兴趣的:(python,django,restful)