纸上得来终觉浅,绝知此事要躬行。
前言
之前的我的两篇博文主要介绍了一下DRF与原生Django的区别、模块以及序列化类家族,本章主要是记录整理一下DRF的视图家族,首先还是通过一张类关系图来梳理DRF中的视图类到底有哪些,之前的继承关系又是什么样的?下图就是他们的继承关系:
minixs UML图
generics UML图
viewsets UML图
基类视图
APIView
APIView是REST framework提供的所有视图的基类,继承自Django的View父类(django/views/generic/base.py)
APIView与View的不同之处在前面的文章有讲到:【Django】DRF源码分析对比原生Django、【Django】DRF源码分析之五大模块
支持定义的属性:
- renderer_classes = []/() # 渲染
- parser_classes = []/() # 解析
- authentication_classes = []/() # 认证
- throttle_classes = []/() # 限流
- permission_classes = []/() # 权限
GenericAPIView
GenericAPIView是继承APIView的,使用完全兼容APIView,主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可以配合一个或多个Mixin扩展类
重点:GenericAPIView在APIView基础上完成了哪些事
- get_queryset():从类属性queryset中获得model的queryset数据
- get_object():从类属性queryset中获得model的queryset数据,再通过有名分组pk确定唯一操作对象
- get_serializer():从类属性serializer_class中获得serializer的序列化类
示例:
class BookGenericAPIView(GenericAPIView):
# 定义查询集
queryset = models.BookModel.objects.filter(is_delete=False)
# 定义序列化器
serializer_class = serializers.BookModelSerializer
# 定义有名分组名称,默认pk
# lookup_field = 'id' 自定义主键的有名分组名
# 群取
# def get(self, request, *args, **kwargs):
# books = self.get_queryset()
# serializer = self.get_serializer(books, many=True)
#
# return Response(serializer.data)
# 单取
def get(self, request, *args, **kwargs):
book = self.get_object()
serializer = self.get_serializer(book)
return Response(serializer.data)
五个视图扩展类(扩展GenericAPIView)
- ListModelMixin(群查)
列表视图扩展类,提供 list
方法快速实现查询视图,返回200状态码。除了查询,该list方法会对数据进行过滤和分页
- CreateModelMixin(单增) #注意:没有群增的方法,需要自己实现
创建视图扩展类,提供 create
方法快速创建资源的视图,成功返回201的状态码
- RetrieveModelMixin(单查)
详情视图扩展类,提供 retrieve
方法,可以快速实现返回一个存在的数据对象。
- UpdateModelMixin(更新,修改) #只有单整体改和单局部改,没有群整体改和群局部改
更新视图扩展类,提供 update
方法,可以快速实现更新一个存在的数据对象,同时也提供partial_update
方法,可以实现局部更新。
- DestoryModelMixin(删除) 一般不怎么用到
删除视图扩展类,提供 destory
方法,可以快速实现删除一个存在数据对象。
GenericAPIView子类视图
所谓的子类视图其实就是GenericAPIView和minixs中的任意一个类混搭满足一定功能的视图。
视图集
常用视图集父类
ViewSet
:继承自APIView
和ViewSetMixin
,没有提供任何方法,需要自己写GenericViewSet
:继承GenericAPIView
和ViewSetMixin
,其中GenericAPIView
提供了基础方法,可以直接搭配Mixin扩展类使用ModelViewSet
:继承GenericViewset
,同时也包括mixin
扩展类
视图集都是默认优先继承ViewSetMixin类,再继承一个视图类(GenericAPIView或APIView),ViewSetMixin
提供了重写的as_view()
方法,继承视图集的视图类,配置路由时调用as_view()必须传入 请求名-函数名 映射关系字典,如下:
url(r'^v1/books/$', views.BookGenericViewSet.as_view({'get': 'my_get_list'})),
表示get
请求会交给my_get_list
视图函数处理