zoukankan      html  css  js  c++  java
  • drf序列化组件之视图家族

    一、视图家族的分类

    1.导入分类
    from rest_framewok import views, generics, mixins, viewsets

    views:视图类

    ​ 两大视图类:APIView、GenericAPIView

    from rest_framework.views import APIView
    from rest_framework.generics import GenericAPIView
    

    mixins:视图工具类

    ​ 六大视图工具类: RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin

    from rest_framework.mixins import RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
    

    generics:工具视图类

    ​ 九大工具视图类:...

    from rest_framework import generics
    

    viewsets:视图集

    ​ 两大视图集基类:ViewSet、GenericViewSet

    from rest_framework import viewsets
    

    2.APIVIiew的特性

    它继承了Django的View

    ​ 1)View:将请求方式与视图类的同名方法建立映射,完成请求响应

    ​ 2)APIView:

    ​ 继承了View所有的功能;

    ​ 重写as_view禁用csrf认证;

    ​ 重写dispatch:请求、响应、渲染、异常、解析、三大认证

    ​ 多了一堆类属性,可以完成视图类的局部配置

    二、views视图类的两大视图类的用法与区别

    APIView:

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from . import models,serializers
    
    # APIView:
    class StudentAPIView(APIView):
        def get(self, request, *args, **kwargs):
            # 群查
            stu_query = models.Sudent.objects.all()
            stu_ser = serializers.StudentModelSerializer(stu_query,many=True)
            print(stu_ser)
            return Response(stu_ser.data)
    
    

    GenericAPIView:

    # GenericAPIView:
    from rest_framework.generics import GenericAPIView
    
    class StudentGenericAPIView(GenericAPIView):
        queryset = models.Sudent.objects.all()
        serializer_class = serializers.StudentModelSerializer
        def get(self, request, *args, **kwargs):
            # 群查
            # stu_query = models.Sudent.objects.all()
            stu_query = self.get_queryset()
            # stu_ser = serializers.StudentModelSerializer(stu_query,many=True)
            stu_ser = self.get_serializer(stu_query, many=True)
    
            return Response(stu_ser.data)
    

    区别:

    1.GenericAPIView继承了APIView,所以它可以用APIView所有的功能
    2.GenericAPIView内部提供了三个常用方法:
    get_object(): 拿到单个准备序列化的对象,用于单查
    get_queryset(): 拿到含有多条数据的Queryset对象,用于群查
    get_serializer(): 拿到经过序列化的的serializer对象
    3.三个常用属性:
    queryset
    serializer_class
    lookup_url_kwarg

    三、视图工具类Mixin的用法与介绍

    以单增和群查为例:

    from rest_framework import mixins
    class StudentMixinGenericAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
        queryset = models.Sudent.objects.all()
        serializer_class = serializers.StudentModelSerializer
        # 群查
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    
        # 单增
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    

    特点:
    1.提供了五大工具类及其六大工具方法:
    CreateModelMixin: create() 实现单增
    ListModelMixin: list() 实现群查
    RetrieveModelMixin:retrieve() 实现单查
    UpdateModelMixin: update() 实现单改 和 perform_update() 实现局部改
    DestroyModelMixin : destroy() 实现单删

    ​ 2.只要调用工具类的方法,就可实现该方法的功能,内部的实现原理据说是将我们之前写的代码进行了一层封装,所以我们直接调用即可

    ​ 3. 由于mixins里的五大工具类没有继承任何视图类views,在配置url的时候没有as_view()方法,也就是不能进行任何的增删改查,所以写视图类时继承GenericAPIView类

    四、工具视图类Mixin的用法与介绍

    # 工具视图类
    from rest_framework.generics import CreateAPIView, RetrieveAPIView, ListAPIView,UpdateAPIView,DestroyAPIView
    class StudentMixinAPIView(CreateAPIView,ListAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView):
        queryset = models.Sudent.objects.all()
        serializer_class = serializers.StudentModelSerializer
        # url中单查,不一定必须提供主键,提供一切唯一键的字段名均可
        lookup_url_kwarg = 'id'
    
        # 有删除需求的接口继承DestroyAPIView,重写destroy完成字段删除
        def destroy(self, request, *args, **kwargs):
            pass
     
    

    分析:

    ​ lookup_url_kwarg: url中单查,不一定必须提供主键,提供一切唯一键的字段名均可,url配置中也要将pk改为id

    ​ 优点:

    ​ CreateAPIView,ListAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView这五个工具类集成了mixins与GenericAPIView里面的类。将它们再进行一次封装,将get,post...等方法封装起来,我们直接继承有该方法的类即可。
    ​ 缺点:

    ​ 单查与群查不能共存,按照继承顺序决定单查还是群查,下面介绍的视图集就能完成共存。

    五、视图集的用法与介绍

    # 视图集
    from rest_framework.viewsets import ModelViewSet
    class StudentModelViewSet(ModelViewSet):
        queryset = models.Sudent.objects.all()
        serializer_class = serializers.StudentModelSerializer
    
        def mypost(self, request, *args, **kwargs):
            return Response('my post ok')
    
    

    分析:

    ​ 通过使用视图集可以实现单查与群查共存,原因从查看源代码得知:

    ModelViewSet继承五大工具类之外还继承了GenericViewSet

    GenericViewSet继承了ViewSet再继承了ViewSetMixin

    而在ViewSetMixin类里面,它重写了as_view()方法,根据继承关系,如果路由匹配上了,先走ViewSetMixin的as_view()方法。在它的as_view()方法里面,它通过给给as_view()方法传参数的方式,对应的工具方法:

    它的原理就是通过给传字典,通过字典里面的数据进行反射,得到请求想要执行的方法。

    在url路由中配置,这样我们就可以区别单查与群查了:

    我们还可以自己重写请求要执行的对应方法。来实现特殊的需求。

    注:由上面的代码可以知道:除了继承APIView的视图类外,其他视图类都要在该类下设置两个属性:

    queryset = models.Student.objects.all()  # 代表跟哪张表建立关系
    serializer_class = serializers.StudentModelSerializer  # 指明用的是哪个序列化器
    
  • 相关阅读:
    必知必会 | Android 性能优化的方面方面都在这儿
    上周热点回顾(1.19-1.25)团队
    上周热点回顾(1.12-1.18)团队
    如何在博客园的markdown编辑器中输入数学公式团队
    上周热点回顾(1.5-1.11)团队
    上周热点回顾(12.29-1.4)团队
    上周热点回顾(12.22-12.28)团队
    云计算之路-阿里云上-寒流来袭:2014年12月23日21:45-23:15网站故障团队
    上周热点回顾(12.15-12.21)团队
    【活动】加班一整年了,程序员们,你们还好吗?团队
  • 原文地址:https://www.cnblogs.com/guapitomjoy/p/11924775.html
Copyright © 2011-2022 走看看