欢迎来到Cecilia陈的博客

孤独,是人一生最好的修行。

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')
posted @ 2019-11-23 19:00  Cecilia陈  阅读(342)  评论(0编辑  收藏  举报