【Django Rest framework】Generic view篇翻译及应用举例

内容介绍

from rest_framework.generics import GenericAPIView

GenericAPIView继承 APIView,主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常可搭配一个或多个Mixin扩展,因此也需要进行序列化的三个步骤,但使用GenericAPIView的时候必须要有一个前提:必须申明当前视图类中操作的模型数据。没有数据是无法进行操作的。

queryset = ModelName.objects.all()  # 必须申明当前视图类中操作的模型数据是什么

或者

serializer_class = ModelNameSerializer  # 可以声明当前要调用的序列化器是什么

重要属性

  1. queryset:视图返回查询集对象, 必须定义或者重写get_queryset() 如果要覆盖视图方法, 则必须进行调用 get_queryset() 而不能直接访问。
  2. serializer_class:用于验证输入和反序列化输出的序列化类, 必须设置此属性或重写 get_serializer_class() 方法。
  3. lookup_field:用于查询模型实例的对象字段内容,默认为 pk。
  4. lookup_url_kwarg:用于查询对象的URL关键字参数。
from rest_framework import serializers
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAdminUser
from .models import *

class ModelNameSerializer(serializers.Serializer):
    ...
    
class ModelNameView(GenericAPIView):
    queryset = ModelName.objects.all()
    serializer_class = ModelNameSerializer
    permission_classes = [IsAdminUser]
    lookup_field = 'colname'

可以结合mixins一起使用更加简单,这部分了解即可,后面还有更简单的实现方式。

  1. perform_create(self, serializer) - CreateModelMixin 保存新对象实例时调用
  2. perform_update(self, serializer) - UpdateModelMixin 保存现有对象实例时调用
  3. perform_destroy(self, instance) - DestroyModelMixin 删除对象实例时调用

在更新serializer.py文件时候,新建实例对象进行保存处理的时候还需要做其他的处理, 可以在进行重写

def perform_create(self, serializer):
    instance = serializer.save()
    ...
def perform_update(self, serializer):
    instance = serializer.save()
    ...
def perform_destroy(self, serializer):
    instance = serializer.save()
    ...

也可以对数据处理进行再次验证, 引发 ValidationError() 异常:

def perform_create(self, serializer):
    if 1 == 1:
        raise ValidationError('不允许创建')
    serializer.save(user=self.request.user)
    
def perform_update(self, serializer):
    if 1 == 1:
        raise ValidationError('不允许更新')
    serializer.save(user=self.request.user)
    
def perform_destroy(self, serializer):
    if 1 == 1:
        raise ValidationError('不允许删除')
    serializer.save(user=self.request.user)

更多的数据请求方式

  1. ListModelMixin
    提供了 .list(request, *args, **kwargs) 方法,用于查询对象集合,可以重写他的list方法实现你自己的返回体,也可以进行数据分页。
  2. CreateModelMixin
    提供 .create(request, *args, **kwargs) 方法,实现创建并保存模型的新实例对象,创建成功返回201 Created,失败返回400 Bad Request 。
  3. RetrieveModelMixin
    提供 .retrieve(request, *args, **kwargs) 方法,实现在响应中返回现有模型实例的详情数据, 用于检索对象, 成功返回200 OK,失败返回404 Not Found。
  4. UpdateModelMixin
    提供 .update(request, *args, **kwargs) 方法,实现更新并保存现有模型的实例,还提供了一种 .partial_update(request, *args, **kwargs) 方法,用于更新的所有字段都是可选的,成功返回200 OK,失败返回400 Bad Request 。
  5. DestroyModelMixin
    提供 .destroy(request, *args, **kwargs) 方法,实现删除现有模型实例, 成功返回204 No Content 响应, 失败返回 404 Not Found。
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin,CreateModelMixi,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
from rest_framework.permissions import IsAdminUser

class ModelNameView(GenericAPIView, ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
    queryset = ModelName.objects.all()
    serializer_class = ModelNameSerializer
    permission_classes = [IsAdminUser]

组合视图

根据自己的实际需要进行选择,里面内容很全了,如果还不能满足需求自行在源码中进行添加即可。

  1. CreateAPIView
    用于仅创建新模型实例对象的视图
    请求方式:POST
    依赖:GenericAPIView, CreateModelMixin
  2. ListAPIView
    用于仅只读模型实例对象集合数据的视图
    请求方式:GET
    依赖:GenericAPIView, ListModelMixin
  3. RetrieveAPIView
    用于仅只读单个模型实例对象的视图
    请求方式:GET
    依赖:GenericAPIView, RetrieveModelMixin
  4. DestroyAPIView
    用于仅删除单个模型实例对象的视图
    请求方式:DELETE
    依赖:GenericAPIView, DestroyModelMixin
  5. UpdateAPIView
    用于仅对已有模型实例进行修改的视图
    请求方式:PUT、PATCH
    依赖:GenericAPIView, UpdateModelMixin
  6. ListCreateAPIView
    用于对模型实例对象集读取和写入的视图
    请求方式:GET、POST
    依赖:GenericAPIView, ListModelMixin, CreateModelMixin
  7. RetrieveUpdateAPIView
    用于对单个模型实例的读取和更新的视图
    请求方式:GET、 PUT、PATCH
    依赖:GenericAPIView, RetrieveModelMixin, UpdateModelMixin
  8. RetrieveDestroyAPIView
    用于对单个模型实例的读取和删除的视图
    请求方式:GET、DELETE
    依赖:GenericAPIView, RetrieveModelMixin, DestroyModelMixin
  9. RetrieveUpdateDestroyAPIView
    用于对单个模型实例的读取、更新和删除的视图
    请求方式:GET、PUT、PATCH、DELETE
    依赖:GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/112992293