• 【Django】DRF视图家族


    纸上得来终觉浅,绝知此事要躬行。

    前言

    之前的我的两篇博文主要介绍了一下DRF与原生Django的区别、模块以及序列化类家族,本章主要是记录整理一下DRF的视图家族,首先还是通过一张类关系图来梳理DRF中的视图类到底有哪些,之前的继承关系又是什么样的?下图就是他们的继承关系:

    minixs UML图

    源码路径(rest_framework/mixins.py)

    generics UML图

    源码路径(rest_framework/generics.py)

    viewsets UML图

    源码路径(rest_framework/viewsets.py)

    基类视图

    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基础上完成了哪些事

    1. get_queryset():从类属性queryset中获得model的queryset数据
    2. get_object():从类属性queryset中获得model的queryset数据,再通过有名分组pk确定唯一操作对象
    3. 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)

    1. ListModelMixin(群查)

    列表视图扩展类,提供 list 方法快速实现查询视图,返回200状态码。除了查询,该list方法会对数据进行过滤和分页

    1. CreateModelMixin(单增) #注意:没有群增的方法,需要自己实现

    创建视图扩展类,提供 create 方法快速创建资源的视图,成功返回201的状态码

    1. RetrieveModelMixin(单查)

    详情视图扩展类,提供 retrieve 方法,可以快速实现返回一个存在的数据对象。

    1. UpdateModelMixin(更新,修改) #只有单整体改和单局部改,没有群整体改和群局部改

    更新视图扩展类,提供 update 方法,可以快速实现更新一个存在的数据对象,同时也提供partial_update方法,可以实现局部更新。

    1. DestoryModelMixin(删除) 一般不怎么用到

    删除视图扩展类,提供 destory 方法,可以快速实现删除一个存在数据对象。

    GenericAPIView子类视图

    所谓的子类视图其实就是GenericAPIView和minixs中的任意一个类混搭满足一定功能的视图。

    视图集

    常用视图集父类

    • ViewSet:继承自APIViewViewSetMixin,没有提供任何方法,需要自己写
    • GenericViewSet:继承GenericAPIViewViewSetMixin,其中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视图函数处理

    相关参考:https://www.cnblogs.com/wangcuican/p/11710450.html

  • 相关阅读:
    【转】QT创建子对话框的方法
    IplImage转为Mat的方法
    浅谈Android选项卡(二)
    浅谈Android选项卡(一)
    Android来电、去电监听
    文件加密
    Java实现文件重命名
    使用单个httpclient实例请求数据。
    获取Android状态栏的高度
    [置顶] 微软翻译接口
  • 原文地址:https://www.cnblogs.com/ydongy/p/13141529.html
Copyright © 2020-2023  润新知