DRF框架中,一共有三個視圖集類,我們這里只說明ModelViewSet一個。
ModelViewSet是封裝度最高的DRF的視圖類。包含了怎刪改查中的所有接口操作。
它繼承自GenericViewSet、ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
所以,在使用ModelViewSet定義API時,我們只需要套用模板即可。
使用視圖集,可以將一系列邏輯相關的動作放到一個類中:
- list() 提供一組數據
- retrieve() 提供單個數據
- create() 創建數據
- update() 更新數據
- destory() 刪除數據
視圖集類不再實現get()、post()、put()、delete()方法,而是實現動作 action。 如 list()、retrieve()、create()、update()、destory()
模板代碼:
class BookInfoViewSet(ModelViewSet): """增刪改查圖書信息""" # 指定查詢集 queryset = BookInfo.objects.all() # 指定序列化器 serializer_class = BookInfoModelSerializer
當我們,定義好了API視圖后,我們需要在路由中,將請求方法與action進行綁定。
路由代碼:
urlpatterns = [ url(r'^books/$', views.BookInfoViewSet.as_view({'get':'list'})), url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get':'retrieve'})), ]
通過,以上講解,我們發現使用ModelViewSet定義API時,非常的方便,只需要幾行代碼即可。
但是,DRF框架提供的action根本不能滿足,我們客戶的奇葩需求,那么,我們需要進行自定義action。
自定義action:
自定義action很簡單,其實,我們只需要在,使用ModelViewSet定義的api類中,自定義action函數后,再將自定義的函數在路由中綁定即可。
自定義action代碼:
def 名稱(self, request): ''' 自定義action :return: JSON數據 ''' pass
路由代碼:
urlpatterns = [ url(r'^books/$', views.BookInfoViewSet.as_view({'get':'action名稱'})), ]
案例代碼:
class BookInfoListAPIView(ModelViewSet): '''使用ModelViewSet定義API 添加數據 ''' # 設置查詢集 queryset = BookInfo.objects.all() # 設置序列化器類 serializer_class = BookInfoModelSerializer def latest(self, request): '''獲取最后一條記錄''' # 獲取模型數據 book = BookInfo.objects.latest('id') # 獲取序列化器對象 s = BookInfoModelSerializer(instance=book) return Response(s.data)
案例路由代碼:
urlpatterns = [ url(r'^books/$', views.BookInfoListAPIView.as_view({'get':'latest'})), ]
