第一步: GenericApiView 是什么?
1. 看源码
class GenericAPIView(views.APIView):
queryset = None
serializer_class = None
...
2. 很明显, GenericAPIView 就是来处理ORM查询到的querrySet对象和serializer类的, 同时还可以处理分页的相关内容, 同时还可以实现过滤, 但是并不提供对get, post方法的处理
GenericAPIView可以说是REST中最基本的一个类了
另外 APIView 继承的就是 View, 里面对部分内容进行了精简, 最为突出的就是对request, 和 response进行了封装
第二步: GenericViewSet 是什么?
1. 看源码
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
pass
2. 很明显, GenericViewSet 仅仅是 在GenericAPIView 的基础上, 加上了ViewSetMixin的功能
而ViewSetMixin简单的讲, 就是重写了as_view()方法, 并且主动将get和post请求绑定到list和create上面(去看第9节课笔记), 让我们可以更加方便的去配置url
所以回到我们的初衷, 我们为什么要使用ViewSet? 原因就是方便配置URL, 并在urls文件中, 就可以实现请求方式与逻辑函数的绑定
3. 先有的ViewSet, 后才能使用router, 当然,它们也是固定搭配, 看第9节课笔记
4. ViewSet还有一个非常大的好处, 就是给request绑定了很多action, 这在后面进行动态的serializer时, 非常有用
第三步: Mixin是什么?
1. 首先我们来看这里我们关于返回goods列表的view逻辑的编写
from rest_framework import mixins
from rest_framework import viewsets
class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
"""
商品列表页
"""
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination # 需要指定分页的类
2. 由于前面已经讲了, Generic没有对get和post请求进行逻辑的编写, 它只负责把接收到的get和post分别绑定给list和create, 那么list和create哪儿来的? 答: Mixin就是干这个事的
3. Mixin包含了下面5个类, 对应的就是http的5种请求方式所绑定的逻辑处理方式
class CreateModelMixin: def create(..) class ListModelMixin: def list(...): class RetrieveModelMixin: def retrieve(...): class UpdateModelMixin: def update(...): class DestroyModelMixin: def destroy(...):
4. 到这里就豁然开朗了, 其实只要弄懂了以上3个大类, 那么REST框架内的所有的类, 就都理解了, 因为剩余的所有的类, 都是基于这3个大类进行的功能的封装
----- over -------