7.9.8视图集
(1)视图集介绍
使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:
- list() 提供一组数据
- retrieve() 提供单个数据
- create() 创建数据
- update() 保存数据
- destory() 删除数据
ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。
视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。
(2)常用视图集父类
1)ViewSet
继承自APIView与ViewSetMixin,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。
ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。
在ViewSet中,没有提供任何动作action方法,需要自己实现action方法。
2)GenericViewSet
GenericViewSet继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用。
3)ModelViewSet
继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
4)ReadOnlyModelViewSet
继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。
(3)视图集基本使用
使用视图集获取列表数据和单一数据
①视图
class BookInfoViewSet(mixins.ListModelMixin,mixins.RetrieveModelMixin,GenericViewSet):
"""使用视图集实现返回列表数据和单一数据"""
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
②路由
# 演示GenericViewSet视图集
url(r'^books/$',views.BookInfoViewSet.as_view({'get':'list'})),
url(r'^books/(?P<pk>\d+)/$',views.BookInfoViewSet.as_view({'get':'retrieve'})),
(4)视图集中定义附加action动作
1)需求
追加读取倒序后的最新数据逻辑,追加修改阅读量的逻辑
2)实现
①视图
在 BookInfoViewSet这个视图中添加:
def latest(self, request):
"""
追加action:返回书籍倒序后的第0个的图书信息
GET /books/latest
"""
book = BookInfo.objects.latest('id')
serializer = self.get_serializer(book)
return Response(serializer.data)
def read(self, request, pk):
"""
追加action:修改图书的阅读量数据
PUT /books/<pk>/read
"""
book = self.get_object()
book.bread = request.data.get('read')
book.save()
serializer = self.get_serializer(book)
return Response(serializer.data)
②路由
# 演示GenericViewSet视图集
url(r'^books/$',views.BookInfoViewSet.as_view({'get':'list'})),
url(r'^books/(?P<pk>\d+)/$',views.BookInfoViewSet.as_view({'get':'retrieve'})),
# 追加action
url(r'^books/latest/$',views.BookInfoViewSet.as_view({'get':'latest'})),
url(r'^books/(?P<pk>\d+)/read/$',views.BookInfoViewSet.as_view({'put':'read'})),