• DRF的视图组件


    DRF的视图组件

    DRF的视图组件大概分以下几类

    两大视图类

    • APIView、GenericAPIView
    from rest_framework.views import APIView
    from rest_framework.generics import GenericAPIView
    	'''
    	APIView继承Django的View
    	   1) View:将请求方式与视图类的同名方法建立映射,完成请求响应
    	   2) APView:除了拥有View的功能之外,还有一些独有的功能
    			View的功能;
    	   		重写as_view禁用csrf认证;
    	   		重写dispatch:请求、响应、渲染、异常、解析、三大认证
    	   		多了一堆类属性,可以完成视图类的局部配置
    	'''
    
    # GenericAPIView提供了三个方法:get_object()、get_queryset()、get_serializer()
    
    from rest_framework.generics import GenericAPIView
    class StudentGenericAPIView(GenericAPIView):
        queryset = models.Student.objects.all()		# 取到所有的学生对象,取到的是一个queryset对象,其实用这些工具我们至少都要定义一个queryset和一个serializer_class
        serializer_class = serializers.StudentModelSerializer		# 
    
        def get(self, request, *args, **kwargs):
            stu_query = self.get_queryset()
            stu_ser = self.get_serializer(stu_query, many=True)
            return Response(stu_ser.data)
    

    六大视图工具类

    • RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin五大工具类

    • 六大工具方法:retrieve、list、create、update、partial_update、destroy

    •   from rest_framework import mixins 
        
      

    class StudentMixinGenericAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
    queryset = models.Student.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)
    ```
    

    九大工具视图类

    • CreateAPIView, DestroyAPIView, ListAPIView, ListCreateAPIView, RetrieveAPIView, RetrieveDestroyAPIView, RetrieveUpdateAPIView, RetrieveUpdateDestroyAPIView, UpdateAPIView

    •   from rest_framework.generics import CreateAPIView, RetrieveAPIView, ListAPIView, UpdateAPIView, DestroyAPIView
        
      
        class StudentMixinAPIView(CreateAPIView, RetrieveAPIView, ListAPIView, UpdateAPIView, DestroyAPIView):
            queryset = models.Student.objects.all()
            serializer_class = serializers.StudentModelSerializer
            # url中单查,不一定必须提供主键,下面的定义就是提供一个供查询的唯一键的字段名即可,当然,需要时表中有的字段,或者是外键字段
            lookup_url_kwarg = 'id'
        
            # 有删除需求的接口继承DestroyAPIView,重写destroy完成字段删除,但其实这个方法没有太大必要,因为这种删除需求会彻底在库中删除数据,而在生产中我们一般只会给is_delet字段修改值而已,所以不需要这个方法,重写的时候只需要修改is_delete字段就好
            def destroy(self, request, *args, **kwargs):
                pass
        
      

    两大视图集基类

    • ViewSet, GenerivViewSet

    •   from rest_framework.viewsets import ModelViewSet
        # 实际上ModelViewSet的源码里面是这么定义的,就是直接继承的mixins(视图工具类)里面的各种方法,几乎包含了所有的方法,除此之外还有一个仅用只读的Model视图集,名为ReadOnlyModelViewSet,
      

    class ModelViewSet(mixins.CreateModelMixin,
    mixins.RetrieveModelMixin,
    mixins.UpdateModelMixin,
    mixins.DestroyModelMixin,
    mixins.ListModelMixin,
    GenericViewSet):
    pass
    # 该类只继承了单查和群查,所以
    class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
    mixins.ListModelMixin,
    GenericViewSet):
    pass

    # 而两大大视图集基类均是继承自ViewSetMixin
    class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
        '''
        可以自定义映射关系的GenericAPIView
        
        '''
    	pass
    class ViewSet(ViewSetMixin, views.APIView):
        '''
        可以自定义映射关系的APIView
        '''
    	pass
    '''
    ViewSetMixin所完成的主要功能就是重写as_view()和view(),从而在url里面可以这样写映射关系,比如
    as_view({
    	'get':'my_get',
    	'post':'my_post',
    	
    	})
    	这样映射关系写过之后,前端发来的url的类型get和post就会映射到视图层的my_get和my_post,这两个方法都是写在View.py的响应方法里面
    '''
    ```
  • 相关阅读:
    Response.Status http协议状态代码
    ASP.NET MVC 如何实现头压缩
    Google PR值原理和详细解说
    NodeJS 深入浅出
    C#: ToString格式
    HttpHandler实现媒体文件和图像文件的盗链(防盗链设计)
    ASP.NET MVC 使用Areas功能的常见错误
    VC中利用多线程技术实现线程之间的通信
    基于Visual C++的Winsock API研究
    键盘钩子程序
  • 原文地址:https://www.cnblogs.com/Xu-PR/p/11937799.html
Copyright © 2020-2023  润新知