11 drf 视图家族(Mixins、Genric)
目录
一、drf视图家族介绍
-
views:视图模块
# 两大视图类: APIView、GenericAPIView
-
mixins:工具模块
# 五大工具类:RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin # 六大工具方法:retrieve(单查)、list(群查)、create(单增)、update(单整体改)、partial_update(单局部改)、destroy(单删)
-
generics:工具视图模块
# 九大工具视图类 # 一堆mixins工具类与GenericAPIView视图基类组合
-
viewsets:视图集模块
''' 视图集基类: ViewSet(ViewSetMixin, APIView):可以自定义映射关系的APIView GenericViewSet(ViewSetMixin, GenericAPIView):可以自定义映射关系的GenericAPIView 常用Model视图集: # 某一资源的六大操作视图集 mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, GenericViewSet # 某一资源的只读操作视图集 mixins.RetrieveModelMixin, mixins.ListModelMixin, GenericViewSet '''
from rest_framework import views, generics, mixins, viewsets
二、视图模块
- 两大视图类: APIView、GenericAPIView
'''
APIView继承Django的View
1) View:将请求方式与视图类的同名方法建立映射,完成请求响应
2) APView:
View的功能;
重写as_view禁用csrf认证;
重写dispatch:请求、响应、渲染、异常、解析、三大认证
多了一堆类属性,可以完成视图类的局部配置
3) GenericAPIView
1. 有APView的所有功能
2. GenericAPIView提供了三个方法:get_object()、get_queryset()、get_serializer()
3)三个属性:queryset、serializer_class、lookup_url_kwarg
'''
2.1 使用GenericAPIView类
-
必须实现两个属性:一个是对哪个表进行操作,一个是用哪个序列化类
queryset = models.Book.objects
serializer_class = serializers.BookModelSerializer
from rest_framework.generics import GenericAPIView
class ViewGenericAPIView(GenericAPIView):
'''在这里指定查表的全部数据'''
queryset = models.Book.objects
'''这里指定反序列化和序列化用哪个序列化类'''
serializer_class = serializers.BookModelSerializer
# 只实现群查
def get(self, request, *args, **kwargs):
# book_query = models.Book.objects.all()
# book_ser = serializers.BookModelSerializer(stu_query, many=True)
# 帮你去拿到表数据
book_query = self.get_queryset()
# 帮你去序列化
book_ser = self.get_serializer(book_query, many=True)
return Response(book_ser.data)
三、工具模块
'''
工具:mixins
重要:在GenericAPIView基础上提供了 六大接口的方法
1)五大工具类:RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
2)六大工具方法:retrieve(单查)、list(群查)、create(单增)、update(单整体改)、partial_update(单局部改)、destroy(单删)
'''
3.1 使用工具模块实现接口
-
重点:必须继承GenericAPIView类
-
必须实现两个属性:一个是对哪个表进行操作,一个是用哪个序列化类
queryset = models.Book.objects
serializer_class = serializers.BookModelSerializer
from rest_framework import mixins
class ViewMixinsAPIView(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
GenericAPIView):
queryset = models.Book.objects
serializer_class = serializers.BookModelSerializer
# 单查群查
def get(self,request,*args,**kwargs):
pk = kwargs.get("pk")
if pk:
return self.retrieve(request,*args,**kwargs)
return self.list(request, *args, **kwargs)
# 单增
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
# 单整体改
def put(self,request, *args, **kwargs):
return self.update(request, *args, **kwargs)
# 单局部改
def patch(self,request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
# 单删
def delete(self,request, *args, **kwargs):
# 删除接口一般自己实现,因为真正的业务需求里没有删除
pass
# 这个删除是真的删除
# return self.destroy(request, *args, **kwargs)
四、工具视图模块
'''
工具视图:generics
这个是工具加视图类的综合,只要继承工具该类,就有相应的方法
1)一堆mixins工具类与GenericAPIView视图基类组合,类中帮你实现好了接口,直接继承即可。
'''
4.1 使用工具视图模块实现接口
-
必须实现两个属性:一个是对哪个表进行操作,一个是用哪个序列化类
queryset = models.Book.objects
serializer_class = serializers.BookModelSerializer
from rest_framework import generics
class ViewGenericsAPIView(generics.RetrieveAPIView,
generics.ListAPIView,
generics.CreateAPIView,
generics.UpdateAPIView,
generics.DestroyAPIView):
'''单查和群查默认只能使用一个get,具体调用哪个。看继承顺序'''
queryset = models.Book.objects
serializer_class = serializers.BookModelSerializer
# url中单查,不一定必须提供主键,提供一切唯一键的字段名均可
lookup_url_kwarg = 'pk'
# 有删除需求的接口继承DestroyAPIView,重写destroy完成字段删除
def destroy(self, request, *args, **kwargs):
pass
五、视图集
- 特点:Model视图集可以在路由层中自定义方法映射关系,因为视图集的基类重写了as_view()方法
'''
视图集:viewsets
可以在路由层中自定义映射:
如:.as_view({'get': 'my_get'})
Model视图集:
ModelViewSet 某一资源的六大操作视图集
ReadOnlyModelViewSet 某一资源的只读操作视图集
基类:
ViewSetMixin:它重写as_view(),完成请求方式与视图方法的自定义映射
视图集基类:
ViewSet(ViewSetMixin, APIView):可以自定义映射关系的APIView
GenericViewSet(ViewSetMixin, GenericAPIView):可以自定义映射关系的GenericAPIView
'''
5.1 使用视图集模块实现接口
-
必须实现两个属性:一个是对哪个表进行操作,一个是用哪个序列化类
queryset = models.Book.objects
serializer_class = serializers.BookModelSerializer
-
可以根据路由层中的自定义映射关系来 编写接口
'''urls.py 路由层'''
urlpatterns = [
# '''视图集:viewsets '''
# 将所有 请求方式 与 响应方法名 的映射关系交给用户自己配置
url(r'^viewsV/$', views.ViewViewsetsAPIView.as_view({
'get': 'list',
'post': 'my_post'
})),
url(r'^viewsV/(?P<pk>\d+)/$', views.ViewViewsetsAPIView.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
})),
]
'''views.py 视图层'''
from rest_framework import viewsets
class ViewViewsetsAPIView(viewsets.ModelViewSet):
queryset = models.Book.objects
serializer_class = serializers.BookModelSerializer
def my_post(self, request, *args, **kwargs):
return Response('my post ok')