drf视图家族

扫码查看

drf视图家族

'''
from rest_framework import views,mixins,generics,viewsets

views:视图-APIView,GenericAPIView(genercs中)
mixins:视图工具类 - CreateModelMixin,ListModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
generics:工具视图类 - 九个类
viewsets:视图集 - 两个视图集基类,两个视图集子类,一个工具类
'''

回顾APIView类:

  1. 拥有View的所有
  2. 重写as_view
  3. 重写dispatch
  4. 一系列类属性

GenericAPIView

  1. 继承APIView,所以拥有APIView的所有
  2. get_queryset方法,配置queryset类属性,提供视图类相关的Models
  3. 在第二条基础上,get_object方法,配置lookup_url_kwarg类属性,提供视图类相关的具体Model
  4. get_serializer方法,配置serializer_class类属性,提供视图类相关的序列化对象

总结:

GenericAPIView就是在APIView基础上额外提供了三个方法,三个类属性,如果不配合视图工具类, 体现不出优势

目的:

视图中的增删改查逻辑相似,但操作的资源不一致,操作资源就是操作 资源对象们、资源对象以及资源相关的序列化类,将这三者形成配置,那操作逻辑就一致,就可以进行封装

mixins视图工具类们:五个类,六个方法

  1. 要配合GenericAPIView类使用,将单查、群查、单增,单整体改,单局部改,单删六个接口封装成retrieve、list、create、update、partial_update、destroy六个方法
  2. 原因:六个方法的实现体,调用的方法就是GenericAPIView提供的,所以要配合GenericAPIView类使用

generics工具视图类们:九种组合

  1. 帮我们将不同个数不同种类的mixins与GenericAPIView进行组合
  2. 不同的组合帮我们实现好对应的get、post、put、patch、delete方法
  3. 需要我们自己配置三个类属性即可:queryset、serializer_class、lookup_url_kwarg

推导过程

'''
class CarView(APIView):
    def get(self):
        obj,
        ser,
        response,

class CarView(GenericAPIView):  # 不会出现,中间产物
    queryset,
    serializer_class,
    lookup_url_kwarg,
    def get(self):
        obj,
        ser,
        response,

class CarView(RetrieveModelMixin, GenericAPIView):  # 自定义组合,可以超过九种
    queryset,
    serializer_class,
    lookup_url_kwarg,
    def get(self):
        self.retrieve()

class CarView(RetrieveAPIView):  # 最终产物,系统只提供了九种组合,RetrieveAPIView是其中一种
    queryset,
    serializer_class,
    lookup_url_kwarg,

'''

视图集总结

'''
"""
核心:视图集都继承了 ViewSetMixin类,该类重写了as_view方法,相比APIView的as_view方法,额外多出了一个参数actions
    as_view({'get': 'list'}) 传入的{'get': 'list'}就被actions介绍,原理是将get请求映射给视图类的list函数进行处理

1)为什么有GenericViewSet和ViewSet两个视图集基类
    GenericViewSet(ViewSetMixin, GenericAPIView),该分支严格满足资源接口
    ViewSet(ViewSetMixin, APIView),该分支满足的接口与资源Model类关系不是特别密切:登录接口、短信验证码接口

2)ReadOnlyModelViewSet,ModelViewSet两个视图集子类,就是做个一堆mixin与GenericViewSet相结合,
    自己在urls文件中配置as_view设置映射关系
"""

'''
12-24 05:51
查看更多