天天看點

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