DRF--【視圖集】詳解

㈠ . ViewSet 視圖集

ViewSetMixin裏重寫了as_view方法,可以更方便的綁定actions。


ViewSet視圖集類不再實現get()、post()等方法,而是實現動作 action 如 list() 、create() 等。
視圖集只在使用as_view()方法的時候,纔會將action動作與具體請求方式對應上

常用視圖集的父類

1) ViewSet

繼承自APIView,作用也與APIView基本類似,提供了身份認證、權限校驗、流量管理等。
在ViewSet中,沒有提供任何動作action方法,需要我們自己實現action方法。
在這裏插入圖片描述

2)GenericViewSet
繼承自GenericAPIView,作用也與GenericAPIVIew類似,提供了get_object、get_queryset等方法便於列表視圖與詳情信息視圖的開發,當然,他也沒有提供任何的action方法。
在這裏插入圖片描述

3)ModelViewSet
繼承自GenericAPIVIew,同時包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
在這裏插入圖片描述

4)ReadOnlyModelViewSet
繼承自GenericAPIVIew,同時包括了ListModelMixin、RetrieveModelMixin;
在這裏插入圖片描述

action屬性
比如:

urlpatterns = [
url(r’^books/ $ ‘, views.BookInfoViewSet.as_view({‘get’: ‘list’})),
url(r’^books/latest/$ ‘, views.BookInfoViewSet.as_view({‘get’: ‘latest’})),
url(r’^books/(?P\d+)/$ ‘, views.BookInfoViewSet.as_view({‘get’: ‘retrieve’})),
url(r’^books/(?P\d+)/read/$’ , views.BookInfoViewSet.as_view({‘put’: ‘read’})),
]

在視圖集中,我們可以通過action對象屬性來獲取當前請求視圖集時的action動作是哪個

現在以ModelViewSet 做代碼案例演示:

class BookInfoAPIView(ModelViewSet):
    # 定義視圖的查詢集
    queryset = BookInfo.objects.all()
    # 指定視圖對應的序列化器
    serializer_class = BookInfoModelSerializer
# url.py中的urlatterns配置
url(r'books/(?P<pk>\d+)/$', views.BookInfoAPIView.as_view({'get': 'retrieve'})),
url(r'books/', views.BookInfoAPIView.as_view({'get': 'list'}))

在繼承了ModelViewSet之後,我們只要在路由中配置的時候,說明什麼請求對應什麼action,就可以很簡單的完成視圖函數的關於數據庫的簡單的增刪改查。


㈡ . 路由router

上面的方式定義路由,相對來說,還是比較繁瑣的,我們現在可以使用更簡單的。

REST framework提供了兩個router:

  • SimpleRouter
  • DefaultRouter

DefaultRouter與SimpleRouter的區別是,DefaultRouter會多附帶一個默認的API根視圖,返回一個包含所有列表視圖的超鏈接響應數據。

使用方法:

(1):創建router對象,並註冊視圖集

from rest_framework import routers

router = routers.SimpleRouter()
router.register(r'books', BookInfoAPIView, base_name='book')

register(prefix, viewset, base_name)

  • prefix 該視圖集的路由前綴
  • viewset 視圖集
  • base_name 路由名稱的前綴

(2):添加路由數據到urlpatterns中
有下面兩種方式都可以

urlpatterns = [
    ...
]
urlpatterns += router.urls
urlpatterns = [
    ...
    url(r'^', include(router.urls))
]

路由router形成URL的方式
在這裏插入圖片描述

在這裏插入圖片描述


㈢ . 視圖集中定義附加action動作

雖然ModelViewSet給我們提供了很簡單的定義視圖函數的方法,但是,並不能滿足咱們的所有需求,所以我們得需要自己定義action動作。

添加自定義動作需要使用rest_framework.decorators.action裝飾器。

以action裝飾器裝飾的方法名會作爲action動作名,與list、retrieve等同。

action裝飾器可以接收兩個參數

  1. methods: 該action支持的請求方式,列表傳遞
  2. detail: 表示是action中要處理的是否是視圖資源的對象(即是否通過url路徑獲取主鍵)

detail參數:

  • True 表示使用通過URL獲取的主鍵對應的數據對象
  • False 表示不使用URL獲取主鍵
class BookInfoAPIView(ModelViewSet):
    # 定義視圖的查詢集
    queryset = BookInfo.objects.all()
    # 指定視圖對應的序列化器
    serializer_class = BookInfoModelSerializer

    # 自定義action動作
    @action(methods=['get'], detail=False)
    def latest(self, request):
        # 本action是獲取最新的書
        book = BookInfo.objects.latest('id')
        ser = self.get_serializer(book)
        return Response(ser.data)

㈣. 視圖函數繼承關係

這個是從pycharm直接導出的,可以根據圖示將視圖之間的繼承關係梳理清楚。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章