内容介绍
from rest_framework.generics import GenericAPIView
GenericAPIView继承 APIView,主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常可搭配一个或多个Mixin扩展,因此也需要进行序列化的三个步骤,但使用GenericAPIView的时候必须要有一个前提:必须申明当前视图类中操作的模型数据。没有数据是无法进行操作的。
queryset = ModelName.objects.all() # 必须申明当前视图类中操作的模型数据是什么
或者
serializer_class = ModelNameSerializer # 可以声明当前要调用的序列化器是什么
重要属性
- queryset:视图返回查询集对象, 必须定义或者重写get_queryset() 如果要覆盖视图方法, 则必须进行调用 get_queryset() 而不能直接访问。
- serializer_class:用于验证输入和反序列化输出的序列化类, 必须设置此属性或重写 get_serializer_class() 方法。
- lookup_field:用于查询模型实例的对象字段内容,默认为 pk。
- 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一起使用更加简单,这部分了解即可,后面还有更简单的实现方式。
- perform_create(self, serializer) - CreateModelMixin 保存新对象实例时调用
- perform_update(self, serializer) - UpdateModelMixin 保存现有对象实例时调用
- 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)
更多的数据请求方式
- ListModelMixin
提供了 .list(request, *args, **kwargs) 方法,用于查询对象集合,可以重写他的list方法实现你自己的返回体,也可以进行数据分页。 - CreateModelMixin
提供 .create(request, *args, **kwargs) 方法,实现创建并保存模型的新实例对象,创建成功返回201 Created,失败返回400 Bad Request 。 - RetrieveModelMixin
提供 .retrieve(request, *args, **kwargs) 方法,实现在响应中返回现有模型实例的详情数据, 用于检索对象, 成功返回200 OK,失败返回404 Not Found。 - UpdateModelMixin
提供 .update(request, *args, **kwargs) 方法,实现更新并保存现有模型的实例,还提供了一种 .partial_update(request, *args, **kwargs) 方法,用于更新的所有字段都是可选的,成功返回200 OK,失败返回400 Bad Request 。 - 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]
组合视图
根据自己的实际需要进行选择,里面内容很全了,如果还不能满足需求自行在源码中进行添加即可。
- CreateAPIView
用于仅创建新模型实例对象的视图
请求方式:POST
依赖:GenericAPIView, CreateModelMixin - ListAPIView
用于仅只读模型实例对象集合数据的视图
请求方式:GET
依赖:GenericAPIView, ListModelMixin - RetrieveAPIView
用于仅只读单个模型实例对象的视图
请求方式:GET
依赖:GenericAPIView, RetrieveModelMixin - DestroyAPIView
用于仅删除单个模型实例对象的视图
请求方式:DELETE
依赖:GenericAPIView, DestroyModelMixin - UpdateAPIView
用于仅对已有模型实例进行修改的视图
请求方式:PUT、PATCH
依赖:GenericAPIView, UpdateModelMixin - ListCreateAPIView
用于对模型实例对象集读取和写入的视图
请求方式:GET、POST
依赖:GenericAPIView, ListModelMixin, CreateModelMixin - RetrieveUpdateAPIView
用于对单个模型实例的读取和更新的视图
请求方式:GET、 PUT、PATCH
依赖:GenericAPIView, RetrieveModelMixin, UpdateModelMixin - RetrieveDestroyAPIView
用于对单个模型实例的读取和删除的视图
请求方式:GET、DELETE
依赖:GenericAPIView, RetrieveModelMixin, DestroyModelMixin - RetrieveUpdateDestroyAPIView
用于对单个模型实例的读取、更新和删除的视图
请求方式:GET、PUT、PATCH、DELETE
依赖:GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin