在繼續製作 API 端點前,先來介紹 DRF 中撰寫 API 的兩種風格,Viewsets 及 APIView。在 Django 中 view 的寫法有分 FBV 以及 CBV,而 Viewsets 及 APIView 皆是 CBV 的寫法。兩者都為 DRF 內建提供的 base classes。要使用 FBV 來製作 API 也是可行的,不過大多使用在簡單的 API。
APIView 較為低層次,著重在 HTTP methods,需要手動實現每個 HTTP method。適合用在簡單或是客製化的操作,像之前的 user 端點便是用此方法實作。在實際使用時,常會繼承 GenericAPIView 以及不同功能的 mixins 來達到想要完成的功能。以下是 CRUD 分別對應的 mixins:
舉個例子,具有 list 跟 create 功能的 APIview 會長這樣:
from rest_framework import mixins
from rest_framework import generics
class ListCreateAPIView(generics.ListModelMixin,
generics.CreateModelMixin,
generics.GenericAPIView):
pass
因為 CRUD 實在太常使用,所以後來就加入了 Viewset,Viewset 為較高層次的類別,通過結合共通行為和 mixins,適合用在複雜操作以及 CRUD 操作。沒有提供 HTTP methods,著重在 actions(list, retrieve, create, update)。有跟 GenericAPIView 類似的 GenericViewSet,其中最常用的是 ModelViewSet,裡面已經包含常用的 CRUD 方法。ModelViewSet 可以使用 router 自動產出一組 CRUD 的 urls。
若是要自己定義一個 viewset 也是可行的,使用 GenericViewSet 加上 mixin 即可,例如:
from rest_framework import mixins
class CreateListRetrieveViewSet(mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet):
pass
這樣便可創造出有 create, list 跟 retrieve 功能的 class。
要如何在 APIView 與 ViewSets 之間選擇,取決於對 API 視圖行為的自定義程度和控制程度。因為會使用到 CRUD 的功能,接下來的 books API 將以 ViewSets 方式實作。下篇文章見~