DRF视图集

视图汇总

一.两个视图基类

1.APIView

View:将请求方式与视图类的同名方法建立映射,完成请求响应
APView:
View的功能;
重写as_view禁用csrf认证;
重写dispatch:请求、响应、渲染、异常、解析、三大认证
多了一堆类属性,可以完成视图类的局部配置

源码之前有分析过,主要就是对django原生的view进行加强

class APIView(View):

2.GenericAPIView

它是继承APIView的,所以它应该比APIView更强大

GenericAPIView提供了三个方法:get_object()、get_queryset()、get_serializer()

get_object()

主要用于单查,可见例2

核心get_queryset()、get_serializer()

核心是上面这个两个方法,分别的功能就是简单的返回结果集合和序列化器(主要是要和视图工具类一起用才有效果,视图类缺的就是这部分的参数)

例1-群查-单增

from rest_framework import mixins
class StudentMixinGenericAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
	#事先准备好这三个重要的参数,父类GenericAPIView默认值为空
	#结果集
    queryset = models.Student.objects.all()
    #序列化器
    serializer_class = serializers.StudentModelSerializer
    #单查字段设置(注意要和有名分组的名字一样)
    
    #list和create都是视图工具类,都依靠上面两个参数运作
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

二.六个工具类

**mixins **

继承了了object类,相当于一个独立封装了各种数据操作的类

六个?

其中UpdateModelMixin有两个功能,整体改和局部改两个功能

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

1.RetrieveModelMixin

单增

2.ListModelMixin

群增

3.CreateModelMixin

单加

4,5.UpdateModelMixin

整体改和局部改

6.DestroyModelMixin

删除

from rest_framework import generics

九大工具视图类(整合视图和工具类)

视图工具的功能就是,把上面的功能在再次的封装,把视图和工具类结合在一起,再次减少代码量,只要继承想要功能的类,就能完成部分功能(已经把功能封装到get.post...里面了)

from rest_framework.generics import DestroyAPIView

#看一下继承的类就知道干了啥了,相当于把例1直接给封装起来了
class DestroyAPIView(mixins.DestroyModelMixin,GenericAPIView):

有哪些呢?

CreateAPIView
post

DestroyAPIView
delete

UpdateAPIView
put
patch

ListAPIView
get

ListCreateAPIView
get
post

RetrieveAPIView
get

RetrieveUpdateAPIView
get
delete

RetrieveDestroyAPIView
get
put
patch

RetrieveUpdateDestroyAPIView
get
put
patch
delete

例2

# 工具视图类
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

缺点

比如单查和群查,它是封装为两个类的,所以继承的时候,无论如何,都只会走第一个类的get方法,这样的话,就有另一个功能无法实现了

两大视图集基类:ViewSet、GenericViewSet(整合工具视图类)

看一下viewsets.py

from rest_framework.viewsets import ModelViewSet

#ViewSetMixin做请求方式和方法的映射
#GenericAPIView类参数和序列化器的获取
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):

某一资源的六大操作视图集
class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):

某一资源的只读操作视图集
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
                           mixins.ListModelMixin,
                           GenericViewSet):
                           
class ViewSet(ViewSetMixin, views.APIView):

class ViewSetMixin:

ViewSetMixin

这个就是实现单查还是多查等方法的区分使用,它重写了as_view来实现,注意要配合as_view的参数来配合使用

ViewSet和GenericViewSet的区别

GenericViewSet适合数据操作绑定的,比如登录用的post,GenericViewSet就会保存数据这样显然是不对的,所以要使用ViewSet,这个是没和数据操作绑定的

使用

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('my post ok')
posted @ 2019-11-23 15:11  zx125  阅读(152)  评论(0编辑  收藏  举报