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 在重新整理就成功了