• drf视图家族


    一、drf视图家族介绍

    • views:视图模块

      # 两大视图类: APIView、GenericAPIView
      
    • mixins:工具模块

      # 五大工具类:RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
      # 六大工具方法:retrieve(单查)、list(群查)、create(单增)、update(单整体改)、partial_update(单局部改)、destroy(单删)
      
    • generics:工具视图模块

      # 九大工具视图类
      # 一堆mixins工具类与GenericAPIView视图基类组合
      
    • viewsets:视图集模块

      '''
      视图集基类:
          ViewSet(ViewSetMixin, APIView):可以自定义映射关系的APIView
      	GenericViewSet(ViewSetMixin, GenericAPIView):可以自定义映射关系的GenericAPIView
      常用Model视图集:	
      	# 某一资源的六大操作视图集
              mixins.CreateModelMixin,
              mixins.RetrieveModelMixin,
              mixins.UpdateModelMixin,
              mixins.DestroyModelMixin,
              mixins.ListModelMixin,
              GenericViewSet
          # 某一资源的只读操作视图集
          	mixins.RetrieveModelMixin,
              mixins.ListModelMixin,
              GenericViewSet
      '''
      
    from rest_framework import views, generics, mixins, viewsets
    

    二、视图模块

    • 两大视图类: APIView、GenericAPIView
    '''
    APIView继承Django的View
    1) View:将请求方式与视图类的同名方法建立映射,完成请求响应
    2) APView:
      View的功能;
      重写as_view禁用csrf认证;
      重写dispatch:请求、响应、渲染、异常、解析、三大认证
      多了一堆类属性,可以完成视图类的局部配置
    3) GenericAPIView
      1. 有APView的所有功能
      2. GenericAPIView提供了三个方法:get_object()、get_queryset()、get_serializer()
      3)三个属性:queryset、serializer_class、lookup_url_kwarg
    '''
    

    2.1 使用GenericAPIView类

    • 必须实现两个属性:一个是对哪个表进行操作,一个是用哪个序列化类

      queryset = models.Book.objects

      serializer_class = serializers.BookModelSerializer

    from rest_framework.generics import GenericAPIView
    class ViewGenericAPIView(GenericAPIView):
        '''在这里指定查表的全部数据'''
        queryset = models.Book.objects
        '''这里指定反序列化和序列化用哪个序列化类'''
        serializer_class = serializers.BookModelSerializer
    
        # 只实现群查
        def get(self, request, *args, **kwargs):
            # book_query = models.Book.objects.all()
            # book_ser = serializers.BookModelSerializer(stu_query, many=True)
    
            # 帮你去拿到表数据
            book_query = self.get_queryset()
            # 帮你去序列化
            book_ser = self.get_serializer(book_query, many=True)
            return Response(book_ser.data)
    

    三、工具模块

    '''
    工具:mixins
    重要:在GenericAPIView基础上提供了 六大接口的方法
    
    1)五大工具类:RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
    2)六大工具方法:retrieve(单查)、list(群查)、create(单增)、update(单整体改)、partial_update(单局部改)、destroy(单删)
    '''
    

    3.1 使用工具模块实现接口

    • 重点:必须继承GenericAPIView类

    • 必须实现两个属性:一个是对哪个表进行操作,一个是用哪个序列化类

      queryset = models.Book.objects

      serializer_class = serializers.BookModelSerializer

    from rest_framework import mixins
    class ViewMixinsAPIView(mixins.RetrieveModelMixin,
                            mixins.ListModelMixin,
                            mixins.CreateModelMixin,
                            mixins.UpdateModelMixin,
                            mixins.DestroyModelMixin,
                            GenericAPIView):
        queryset = models.Book.objects
        serializer_class = serializers.BookModelSerializer
        # 单查群查
        def get(self,request,*args,**kwargs):
            pk = kwargs.get("pk")
            if pk:
                return self.retrieve(request,*args,**kwargs)
            return self.list(request, *args, **kwargs)
    
        # 单增
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    
        # 单整体改
        def put(self,request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        # 单局部改
        def patch(self,request, *args, **kwargs):
            return self.partial_update(request, *args, **kwargs)
    
        # 单删
        def delete(self,request, *args, **kwargs):
            # 删除接口一般自己实现,因为真正的业务需求里没有删除
            pass
            # 这个删除是真的删除
            # return self.destroy(request, *args, **kwargs)
    
    

    四、工具视图模块

    '''
    工具视图:generics
    
    这个是工具加视图类的综合,只要继承工具该类,就有相应的方法
    1)一堆mixins工具类与GenericAPIView视图基类组合,类中帮你实现好了接口,直接继承即可。
    '''
    
    

    4.1 使用工具视图模块实现接口

    • 必须实现两个属性:一个是对哪个表进行操作,一个是用哪个序列化类

      queryset = models.Book.objects

      serializer_class = serializers.BookModelSerializer

    from rest_framework import generics
    class ViewGenericsAPIView(generics.RetrieveAPIView,
                              generics.ListAPIView,
                              generics.CreateAPIView,
                              generics.UpdateAPIView,
                              generics.DestroyAPIView):
        '''单查和群查默认只能使用一个get,具体调用哪个。看继承顺序'''
        queryset = models.Book.objects
        serializer_class = serializers.BookModelSerializer
        # url中单查,不一定必须提供主键,提供一切唯一键的字段名均可
        lookup_url_kwarg = 'pk'
    
        # 有删除需求的接口继承DestroyAPIView,重写destroy完成字段删除
        def destroy(self, request, *args, **kwargs):
            pass
    
    

    五、视图集

    • 特点:Model视图集可以在路由层中自定义方法映射关系,因为视图集的基类重写了as_view()方法
    '''
    视图集:viewsets 
        可以在路由层中自定义映射:
            如:.as_view({'get': 'my_get'})
    
    Model视图集:
        ModelViewSet    某一资源的六大操作视图集
        ReadOnlyModelViewSet    某一资源的只读操作视图集
    
    基类:
        ViewSetMixin:它重写as_view(),完成请求方式与视图方法的自定义映射
    视图集基类:
        ViewSet(ViewSetMixin, APIView):可以自定义映射关系的APIView
    	GenericViewSet(ViewSetMixin, GenericAPIView):可以自定义映射关系的GenericAPIView
    '''
    
    

    5.1 使用视图集模块实现接口

    • 必须实现两个属性:一个是对哪个表进行操作,一个是用哪个序列化类

      queryset = models.Book.objects

      serializer_class = serializers.BookModelSerializer

    • 可以根据路由层中的自定义映射关系来 编写接口

    '''urls.py 路由层'''
    
    urlpatterns = [
        # '''视图集:viewsets '''
        # 将所有 请求方式 与 响应方法名 的映射关系交给用户自己配置
        url(r'^viewsV/$', views.ViewViewsetsAPIView.as_view({
            'get': 'list',
            'post': 'my_post'
        })),
        url(r'^viewsV/(?P<pk>d+)/$', views.ViewViewsetsAPIView.as_view({
            'get': 'retrieve',
            'put': 'update',
            'patch': 'partial_update',
            'delete': 'destroy'
        })),
    ]
    
    
    '''views.py 视图层'''
    
    from rest_framework import viewsets
    class ViewViewsetsAPIView(viewsets.ModelViewSet):
        queryset = models.Book.objects
        serializer_class = serializers.BookModelSerializer
    
        def my_post(self, request, *args, **kwargs):
            return Response('my post ok')
    
    
  • 相关阅读:
    java MVC设计模式探究——mvc在JAVA应用程序中的应用
    datagridview 的Columns 点击列标题 禁止排序
    组合键事件
    对一段视频,采帧(总结)
    datagridview中加入checkbox列,全选问题
    微软的RDLC报表(转)
    Linq to sql直接执行sql语句(转)
    获取当月的第1天
    AxWindowsMediaPlayer的详细用法
    DataSet
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11915009.html
Copyright © 2020-2023  润新知