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