视图家族

视图家族

一、概述

​ 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')

posted @ 2019-11-25 22:22  唐ceng  阅读(152)  评论(0编辑  收藏  举报