視圖集ViewSet
使用視圖集ViewSet,能夠將一系列邏輯相關的動做放到一個類中:post
list() 提供一組數據
retrieve() 提供單個數據
create() 建立數據
update() 保存數據
destory() 刪除數據
ViewSet視圖集類再也不實現get()、post()等方法,而是實現動做 action 如 list() 、create() 等。url
視圖集只在使用as_view()方法的時候,纔會將action動做與具體請求方式對應上。如:rest
class BookInfoViewSet(viewsets.ViewSet):code
def list(self, request): ... def retrieve(self, request, pk=None): ...
在設置路由時,咱們能夠以下操做對象
urlpatterns = [
url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
url(r'^books/(?P
]
action屬性
在視圖集中,咱們能夠經過action對象屬性來獲取當前請求視圖集時的action動做是哪一個。
例如:資源
def get_serializer_class(self):
if self.action == 'create':
return OrderCommitSerializer
else:
return OrderDataSerializer
經常使用視圖集父類
1) ViewSet
繼承自APIView,做用也與APIView基本相似,提供了身份認證、權限校驗、流量管理等。路由
在ViewSet中,沒有提供任何動做action方法,須要咱們本身實現action方法。開發
2)GenericViewSet
繼承自GenericAPIView,做用也與GenericAPIVIew相似,提供了get_object、get_queryset等方法便於列表視圖與詳情信息視圖的開發。get
3)ModelViewSet
繼承自GenericAPIVIew,同時包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
4)ReadOnlyModelViewSet
繼承自GenericAPIVIew,同時包括了ListModelMixin、RetrieveModelMixin。
視圖集中定義附加action動做
在視圖集中,除了上述默認的方法動做外,還能夠添加自定義動做。
添加自定義動做須要使用rest_framework.decorators.action裝飾器。
以action裝飾器裝飾的方法名會做爲action動做名,與list、retrieve等同。
action裝飾器能夠接收兩個參數:
methods: 該action支持的請求方式,列表傳遞
detail: 表示是action中要處理的是不是視圖資源的對象(便是否經過url路徑獲取主鍵)
True 表示使用經過URL獲取的主鍵對應的數據對象
False 表示不使用URL獲取主鍵
舉例:
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
# detail爲False 表示不須要處理具體的BookInfo對象 @action(methods=['get'], detail=False) def latest(self, request): """ 返回最新的圖書信息 """ book = BookInfo.objects.latest('id') serializer = self.get_serializer(book) return Response(serializer.data) # detail爲True,表示要處理具體與pk主鍵對應的BookInfo對象 @action(methods=['put'], detail=True) def read(self, request, pk): """ 修改圖書的閱讀量數據 """ book = self.get_object() book.bread = request.data.get('read') book.save() serializer = self.get_serializer(book) return Response(serializer.data)
url的定義
urlpatterns = [
url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
url(r'^books/(?P
url(r'^books/(?P