drf视图家族
'''
from rest_framework import views,mixins,generics,viewsets
views:视图-APIView,GenericAPIView(genercs中)
mixins:视图工具类 - CreateModelMixin,ListModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
generics:工具视图类 - 九个类
viewsets:视图集 - 两个视图集基类,两个视图集子类,一个工具类
'''
回顾APIView类:
- 拥有View的所有
- 重写as_view
- 重写dispatch
- 一系列类属性
GenericAPIView
- 继承APIView,所以拥有APIView的所有
- get_queryset方法,配置queryset类属性,提供视图类相关的Models
- 在第二条基础上,get_object方法,配置lookup_url_kwarg类属性,提供视图类相关的具体Model
- get_serializer方法,配置serializer_class类属性,提供视图类相关的序列化对象
总结:
GenericAPIView就是在APIView基础上额外提供了三个方法,三个类属性,如果不配合视图工具类, 体现不出优势
目的:
视图中的增删改查逻辑相似,但操作的资源不一致,操作资源就是操作 资源对象们、资源对象以及资源相关的序列化类,将这三者形成配置,那操作逻辑就一致,就可以进行封装
mixins视图工具类们:五个类,六个方法
- 要配合GenericAPIView类使用,将单查、群查、单增,单整体改,单局部改,单删六个接口封装成retrieve、list、create、update、partial_update、destroy六个方法
- 原因:六个方法的实现体,调用的方法就是GenericAPIView提供的,所以要配合GenericAPIView类使用
generics工具视图类们:九种组合
- 帮我们将不同个数不同种类的mixins与GenericAPIView进行组合
- 不同的组合帮我们实现好对应的get、post、put、patch、delete方法
- 需要我们自己配置三个类属性即可: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设置映射关系
"""
'''