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  # 指明用的是哪个序列化器
    
  • 相关阅读:
    C#
    C#
    ssh学习笔记
    (已解决)Could not open '/var/lib/nova/mnt/*/volume-*': Permission denied
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    如何在linux下安装idea
    The system has no LUN copy license
    调整mysql数据库最大连接数
    mysql数据库编码问题
    cinder支持nfs快照
  • 原文地址:https://www.cnblogs.com/guapitomjoy/p/11924775.html
Copyright © 2011-2022 走看看