视图集ViewSet
使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:
- list() 提供一组数据
- retrieve() 提供单个数据
- create() 创建数据
- update() 保存数据
- destory() 删除数据
ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。
01-视图集的继承分析
-
两个基本视图集 Viewset GenericViewset
1) ViewSet
继承自
APIView
,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。
2)GenericViewSet
继承自
GenericAPIView
,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。 -
两个拓展视图集ModelViewset ReadOnlyModelViewSet
1)ModelViewSet
继承自
GenericAPIVIew
,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。2)ReadOnlyModelViewSet
继承自
GenericAPIVIew
,同时包括了ListModelMixin、RetrieveModelMixin。
02-视图集的基本使用
-
视图集路由匹配
-
视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上
# 视图集路由匹配 viewset url(r'^books/$', view_set.BooksViewSet.as_view({'get':'list','post':'create'}))
03-viewset的基本使用
- ViewSet可以使用我们自己定义的方法名进行对应不同的请求方式,路由配置稍有不同
04-actions属性的使用
- 使用action可以根据需求切换序列化器,可以在一视图中根据情况使用不同的序列化器
def get_serializer_class(self):
if self.action == 'create':
return OrderCommitSerializer
else:
return OrderDataSerializer
在视图集中,还可以添加自定义动作。
添加自定义动作需要使用rest_framework.decorators.action
装饰器。
以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。
action装饰器可以接收两个参数:
-
methods: 该action支持的请求方式,列表传递
-
detail表示是action中要处理的是否是视图资源的对象(即是否通过url路径获取主键)
-
True 表示使用通过URL获取的主键对应的数据对象
-
False 表示不使用URL获取主键
-