基本视图类
1)APIView
特点
-
需要自定义get、post、put等请求方法,并且自己实现方法内部的所有逻辑。
-
必须用实例化类的方式来调用序列化器,比如
serializer = ClassInfoSerializer(books, many=True)
使用场景
- 视图中实现的功能比较简单
- 对序列化器依赖不强,只需要序列化数据,不要其他的验证,保存修改等操作
- 不操作数据库
2)GenericAPIView
特点
-
同样需要自定义get、post等方法,但是可以配合扩展类,简化方法内部的逻辑
-
为列表视图和详情视图提供了通用支持方法,比如
get_queryset(self) get_serializer(self, args, *kwargs) 可以在其他扩展类中使用 分页过滤
-
配合扩展,简化视图编写
使用场景
- 列表需要分页,过滤
- 需要简化视图方法,配合扩展类
视图扩展类
扩展类必须配合GenericAPIView使用
扩展类内部的方法,在调用序列化器时,都是使用get_serializer
需要自定义get、post等请求方法,内部实现调用扩展类对应方法即可,比如:
class ClassListView(ListModelMixin, GenericAPIView):
queryset = ClassInfo.objects.all()
serializer_class = ClassInfoSerializer
def get(self, request):
return self.list(request)
1)ListModelMixin
- 提供list方法,快速实现列表视图
- 调用GenericAPIView设置好的结果集
- 调用GenericAPIView设置好的序列化器
2)CreateModelMixin
- 提供
create(request, *args, **kwargs)
方法快速实现创建资源的视图 - 实际创建功能由序列化的save方法完成
- save方法会去调用序列化器的create方法
3)RetrieveModelMixin
- 提供
retrieve(request, *args, **kwargs)
方法,可以快速实现返回一个存在的数据对象。
4)UpdateModelMixin
- 提供
update(request, *args, **kwargs)
方法,可以快速实现更新一个存在的数据对象。 - 内部更新功能调用序列化器的save方法
- save方法会调用序列化器的update方法
5)DestroyModelMixin
- 提供
destroy(request, *args, **kwargs)
方法,可以快速实现删除一个存在的数据对象。 - 内部模型对象的delete方法
子视图类
特点
-
类视图中不需要自定义具体的get、post等请求方法
-
对GenericAPIView和视图扩展类的进一步封装
使用场景
- 对应不同请求,继承相应的子类视图
- 操作模型类的情况比较多
1) CreateAPIView
提供 post 方法
继承自: GenericAPIView、CreateModelMixin
2)ListAPIView
提供 get 方法
继承自:GenericAPIView、ListModelMixin
3)RetireveAPIView
提供 get 方法
继承自: GenericAPIView、RetrieveModelMixin
4)DestoryAPIView
提供 delete 方法
继承自:GenericAPIView、DestoryModelMixin
5)UpdateAPIView
提供 put 和 patch 方法
继承自:GenericAPIView、UpdateModelMixin
6)RetrieveUpdateAPIView
提供 get、put、patch方法
继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin
7)RetrieveUpdateDestoryAPIView
提供 get、put、patch、delete方法
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
视图集
特点
使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:
- list() 提供一组数据
- retrieve() 提供单个数据
- create() 创建数据
- update() 保存数据
- destory() 删除数据
- 自定义视图方法
- 视图定义简单
- 路由简单
应用
- 针对一个资源,需要使用的操作比较多
- 操作数据库比较多
- 使用序列化器频繁
1) ViewSet
继承自APIView
,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。
在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。
2)GenericViewSet
继承自GenericAPIView
,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。
3)ModelViewSet
继承自GenericAPIVIew
,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
4)ReadOnlyModelViewSet
继承自GenericAPIVIew
,同时包括了ListModelMixin、RetrieveModelMixin。
序列化器
序列化器类型:
Serializer
- 需要自定义序列化反序列化字典
- 需要自己实现create和update方法
ModelSerializer
- 基于模型类自动生成一系列字段
- 基于模型类自动为Serializer生成validators
- 包含默认的create()和update()的实现
1)序列化
将模型对象序列化为字典
serializer = ClassInfoSerializer(book)
serializer.data #获取序列化数据
2)反序列化
将字典反序列化为模型类对象
data = {'title': '计算机1班'} # 要反序列化的数据
serializer = ClassInfoSerializer(data=data) # 序列化器对象
serializer.is_valid() #验证
serializer.errors #验证错误原因
serializer.validated_data #通过验证反序列化候的数据
3)反序列化数据验证
-
validate_(field_name)
-
validate
-
validators
4)保存数据create,修改数据update
序列化器.save()
- ModelSerializer自己实现
- Serializer需要自定义