天天看点

Drf框架的各种View以及ViewSet的继承关系

最近在频繁使用DjangoRestFramework, 发现里面前辈留下的代码各种写法都有。

例如针对视图层, 有继承自APIView, 有继承自ViewSet的, 也有继承自GenericViewSet的,甚至还有继承ReadOnlyViewSet的,

一点都不明白为什么要整得这么复杂, 整个人都看晕了。

从视图层角度来说, Django是有自己的视图view的, 但是比较原始, 不支持datetime的序列化。

所以Drf在view的基础上封装出了自己的APIView, 在APIView里,有Drf自己的request, 而且常用Api和django差不多,算是一个基

础封装, 因为非常基础, 所以需要我们自己提供cbv方法, 如get,post等。

可是这样手写太过麻烦, 于是在APIView的基础上, Drf框架又封装出了ViewSet, ViewSet内部出了继承自APIView外, 还继承了一个叫ViewSetMixin的东西, 这个东西提供了一个as_view方法, 内部提供了‘list’, 'create'等各种各种action, 这样我们就可以在get方法内部调用list方法, 这样就将get等各个动作和action关联起来了。

而紧挨着ViewSet的就是GenericViewSet, 这个类也继承了ViewSetMixin, 还继承了GenericAPIView, 这个父类又继承自APIView, 不同的是在APIView基础上提供了一系列的get_object,get_queryset等方法, 用以支持全部查找、详情查看、分页、过滤等等。

其实到了这里的话代码已经很方便了, 但是考虑不同的场景, 可能有些地方只需要提供默认的API接口进行查找就行了, 于是就诞生了ReadOnlyModelViewSet, 这货继承了RetrieveModelMixin、ListModelMixin, 这两个是什么东西呢, 点进去看就会发现, 他们提供了retrieve和list方法的默认实现, 同时还继承了GenericViewSet, 也就是如果我们只需要默认的查找功能的话, 只需要写一个视图类继承自ReadOnlyModelViewSet就成了,然后直接url只想这个视图类就完成了, 大大简化了代码。

同时Drf还提供了ModelViewSet, 仔细看他的继承类就应该不难猜到这是一个提供了默认增删改查等多种API的视图类。

那么像上面这么多视图类我们该如何去抉择呢?

我觉得可以按照自己的代码习惯,以及业务场景进行选择。

如果自己需要的视图类定制程度较高可以选择较基础的视图类,或者选择封装程度高的视图类进行复写也可,如果需要的功能简单,那么就可以直接选用封装程度高的视图类,以节省自己的时间和代码量。