天天看点

Django--视图集ViewSet

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'})),
           

执行结果:

Django--视图集ViewSet
Django--视图集ViewSet

 视图集中定义附加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'})),
           

执行效果:

Django--视图集ViewSet

 read 路由发送put请求,第一次报错,我们将字典清空,添加'read':222 在刷新就成功了

Django--视图集ViewSet
Django--视图集ViewSet
Django--视图集ViewSet