概述
在DRF中,允许在一个类中组合一组相关视图的逻辑,称为ViewSets
。比如通过通用视图,可以定义列表视图、详情视图等等,但每个视图位于不同的类中,而通过ViewSets则可以将多个视图放在同一个类中。
ViewSets也是一种基于类的视图,只不过和APIView不同的是,它并不提供如get()
、post()
等和HTTP请求相对应的方法,而提供的是如list()
、create()
这样的操作方法。
在配置ViewSets的URL时,一般不会显示进行配置,而是使用Routers
类来注册ViewSets,Routers会自动确定URL格式。
Router
可以将请求和视图自动进行匹配,并映射相应的处理逻辑。
如果我们使用的是ViewSets而非View,那么我们就没必要自己去配置每个View对应的Url了,直接使用Router注册一个视图集,让Router来完成剩下的工作。
1.viewsets类
使用viewsets时需要导入所在模块:
from rest_framework import viewsets
所有的viewsets类都直接或间接的继承于ViewSetMixin
这个基类。目前viewsets相关类有包中有四个类,接下来我们逐一进行总结.
1.1.ViewSet
ViewSets继承了ViewSetMixin和APIView,因此具有APIView的一些属性,如permission_class
和authentication_classes
属性,但没有实现具体的动作,所以在平时开发时,会很少用到它。该类源码如下:
class ViewSet(ViewSetMixin, views.APIView):
"""
The base ViewSet class does not provide any actions by default.
"""
pass
1.2.GenericViewSet
GenericViewSet继承于ViewSetMixin
和GenericAPIView
,因此具有GenericAPIView拥有的一些属性和方法,如serializer_class
、queryset
、get_queryset()
、get_object()
等其他方法和属性,但同样也没有提供操作请求的动作实现,因此该类经常和其他generic
包下的具体通用视图一起使用,如: