ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如
{'get':'list'}
)的映射处理工作。
常用的视图集父类
GenericViewSet 继承自
GenericAPIView
与
ViewSetMixin
,在实现了调用as_view()时传入字典(如
{'get':'list'}
)的映射处理工作的同时,还提供了
GenericAPIView
提供的基础方法,可以直接搭配Mixin扩展类使用。
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
class BookInfoViewSet(mixins.ListModelMixin,mixins.RetrieveModelMixin,GenericViewSet):
"""使用GenericViewSet实现返回列表和单一值"""
# 指定序列化器
serializer_class = BookInfoSerializer
# 制定查询集
queryset = BookInfo.objects.all()
url设置:
url(r'^books/$', new_views.BookInfoViewSet.as_view({'get':'list'})),
url(r'^books/(?P<pk>\d+)/$', new_views.BookInfoViewSet.as_view({'get':'retrieve'})),
执行结果:
视图集中定义附加action动作
def latest(self, request):
"""
返回最新的图书信息
GET /books/latest
"""
book = BookInfo.objects.latest('id')
serializer = self.get_serializer(book)
return Response(serializer.data)
def read(self, request, pk):
"""
修改图书的阅读量数据
PUT /books/<pk>/read/ 遵循REST设计风格的url命名方式
"""
book = self.get_object()
book.bread = request.data.get('read')
book.save()
serializer = self.get_serializer(book)
return Response(serializer.data)
url设置:
url(r"^books/latest/$",new_views.BookInfoViewSet.as_view({'get':'latest'})),
url(r"^books/(?P<pk>\d+)/read/$",new_views.BookInfoViewSet.as_view({'put':'read'})),
执行效果:
read 路由发送put请求,第一次报错,我们将字典清空,添加'read':222 在刷新就成功了