• 视图家族


    视图家族

    一、概述

    ​ drf提供了一系列视图及工具:

    from rest_framework import views, generics, mixins, viewsets
    

    ​ 1、views:视图类

    ​ 2、mixins:视图工具类

    ​ 3、generics:工具视图类

    ​ 4、viewsets:视图集

    二、分类

    ​ 两大视图类:

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

    ​ 六大视图工具类:

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

    ​ 九大工具视图类

    from rest_framework import generics
    

    ​ generics中有CreateAPIView、ListAPIView、RetrieveAPIView、DestroyAPIView、UpdateAPIView、ListCreateAPIView、RetrieveUpdateAPIView、RetrieveDestroyAPIView、RetrieveUpdateDestroyAPIView。

    三、两大视图集基类

    ​ 两大视图集的基类分别是ViewSet、GenericViewSet,分别继承自View的APIView和GenericAPIView。

    ​ 1、view:将请求方式和视图类的同名方法见了映射,完成请求响应

    ​ 2、APIView:继承自Django的View,其具备View的功能。写了as_view,禁用了csrf认证。重写了dispatch:请求、响应、渲染、异常、解析、三大认证。并且添加了一堆类属性,可以完成视图类的局部配置。

    ​ 再APIView中仍以常规的类视图定义方法来实现get()、post()或其他请求方式方法。

    from rest_framework.views import APIView
    from rest_framework.response import Respones
    
    #    url(r'^v1/students/$', views.StudentAPIView.as_view()),
    #    url(r'^v1/students/(?P<pk>d+)/$', views.StudentAPIView.as_view()),
    
    class StudentAPIView(APIView):
        def get(self, request, *args, **kwargs):
            stu_query = models.Student.objects.all()
            stu_ser = serializers.StudentModelSerializer(stu_query, many=Ture)
            return Response(stu_ser.data)
    

    ​ 3、GenericAPIView:具备了APView的所有功能。具备了三个方法get_object()、get_queryset()、get_serializer()。具备了三个属性queryset、serializer_class、lookup_url_kwarg。

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

    四、视图工具类

    ​ mixins包提供了五大工具类和六大工具方法。

    ​ 五大工具类:RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin。

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

    from rest_framework import mixins
    class StudentMixGenericAPIView(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)
    

    五、工具视图类

    ​ 工具视图类提供七个子类视图

    ​ 1、CreateAPIView:提供post方法

    ​ 2、ListAPIView:提供get方法

    ​ 3、RetrieveAPIView:提供get方法

    ​ 4、RetrieveUpdateAPIView:提供get、put、patch方法

    ​ 5、UpdateAPIView:提供put和patch方法

    ​ 6、DestroyAPIView:提供delete方法

    ​ 7、RetrieveUpdateDestroyAPIView:提供get、put、patch、delete方法

    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完成字段删除
        def destroy(self, request, *args, **kwargs):
            pass
    

    六、视图集

    ​ 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:
    ​ 1、list() 提供一组数据
    ​ 2、retrieve() 提供单个数据
    ​ 3、create() 创建数据
    ​ 4、update() 保存数据
    ​ 5、destory() 删除数据
    ​ ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create()
    等。
    ​ 视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。

    ​ urls.py:

    # 将所有 请求方式 与 响应方法名 的映射关系交给用户自己配置
    url(r'^v5/students/$', views.StudentModelViewSet.as_view({
            'get': 'list',
            'post': 'my_post'
        })),
        url(r'^v5/students/(?P<pk>d+)/$', views.StudentModelViewSet.as_view({
            'get': 'retrieve',
            'put': 'update',
            'patch': 'partial_update',
            'delete': 'destroy'
        })),
    
    

    ​ views.py:

    from rest_framework.viewsets import ModelViewSet
    class StudentModelViewSet(ModelViewSet):
        queryset = models.Student.objects.all()
        serializer_class = serializers.StudentModelSerializer
        
        def my_post(self, request, *args, **kwargs):
            return Response('mt post ok')
    
    
  • 相关阅读:
    tomcat的安装以及环境配置
    MySQL日期/时间函数
    docker部署tomcat
    Lambda的高级查询
    Linq的使用
    多线程编程
    反射
    匿名类型
    委托和事件
    泛型特性
  • 原文地址:https://www.cnblogs.com/tangceng/p/11931192.html
Copyright © 2020-2023  润新知