由于Django REST Framework API 文档不是太详细,市场上又缺乏具有深度的书籍,导致在学习过程中因为不同 View 的使用经常搞混其功能。反复思量之后,做了下面的 Matrix 来区分这些类之间的关系与功能。
a) 首先要弄清楚 View 的继承关系从高到低继承为:
GenericViewSet(DRF) 继承 GenericAPIView(DRF) 继承 APIView(DRF) 继承 View (Django 原生)
b) 其次为了实现特定的 Actions 这些 Views 与 Mixin 类实现了多重继承,形成了如下 APIView 和 ViewSet 类:
GenericAPIView + 一个或多个(CreateModelMixin, ListModelMixin, UpdateModelMixin, DestoryModelMixin, RetrievModelMixin)生成了 ListAPIView, CreateAPIView, RetrieveAPIView, DestoryAPIView, UpdateAPIView,ListCreateAPIView, RetireveUpdateAPIView, RetrieveDestoryAPIView, RetrieveUpdateDestoryAPIView 使用这些类时不需要继承 ModelMixin 中的类来实现 action,也不需要继承 GenericAPIView,因为他们的父类就是 GenericAPIView。
c) 与 ViewSet 不同的是:
这些 only 继承 GenericAPIView 和 ModelMixin 的类不能使用 Router 注册 URL。
d) GenericViewSet 以及继承了它的类,可以直接使用 Router 来注册 URL,比如:
某类 class MyViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): 由于GenericViewSet不包括 action, 所以需要配合 ModelMixin 使用,这样配置也可直接使用 Router 或者直接调用现成的高级类:ModelViewSet 或 ReadOnlyModelViewSet 也可达到类似效果
e) 在功能迷惑时查下面表格即可了解如何使用这些类
需手写 queryset, serializer, Pagination | 需手动绑定 Action | 需与Minxin配合使用 | 可否通过Router注册 | 自定义 handler 方法 如 get, post 等 | 父类 | |
View | Yes | No | No | No | Yes | Object |
APIView | Yes | No | No | No | Yes | View |
GenericAPIView | No | Yes/No | Yes | No | Yes/No | APIView |
ListAPIView CreateAPIViewRetrieveAPIViewDestoryAPIViewUpdateAPIViewListCreateAPIViewRetireveUpdateAPIViewRetrieveDestoryAPIViewRetrieveUpdateDestoryAPIView | No | No | No | No | No | GenericAPIView + 1 or more(CreateModelMixin,ListModelMixin,UpdateModelMixin,DestoryModelMixin,RetrievModelMixin) |
GenericViewSet | No | No | Yes | Yes | No | GenericAPIView |
ModelViewSet ReadOnlyModelViewSet | No | No | No | Yes | No | GernericViewSet + 1 or more(CreateModelMixin,ListModelMixin,UpdateModelMixin,DestoryModelMixin,RetrievModelMixin) |