iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
自我挑戰組

轉職新手學 Django 及 DRF系列 第 25

Day 25 - 中場暫停(三) APIView vs ViewSets

  • 分享至 

  • xImage
  •  

在繼續製作 API 端點前,先來介紹 DRF 中撰寫 API 的兩種風格,Viewsets 及 APIView。在 Django 中 view 的寫法有分 FBV 以及 CBV,而 Viewsets 及 APIView 皆是 CBV 的寫法。兩者都為 DRF 內建提供的 base classes。要使用 FBV 來製作 API 也是可行的,不過大多使用在簡單的 API。

APIView

APIView 較為低層次,著重在 HTTP methods,需要手動實現每個 HTTP method。適合用在簡單或是客製化的操作,像之前的 user 端點便是用此方法實作。在實際使用時,常會繼承 GenericAPIView 以及不同功能的 mixins 來達到想要完成的功能。以下是 CRUD 分別對應的 mixins:

  • C: mixins.CreateModelMixin
  • R: mixins.ListModelMixin, mixins.RetrieveModelMixin
  • U: mixins.UpdateModelMixin
  • D: mixins.DestroyModelMixin

舉個例子,具有 list 跟 create 功能的 APIview 會長這樣:

from rest_framework import mixins
from rest_framework import generics

class ListCreateAPIView(generics.ListModelMixin,
                        generics.CreateModelMixin,
                        generics.GenericAPIView):
    pass

Viewsets

因為 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 方式實作。下篇文章見~


上一篇
Day 24 - 製作 API(四) User 更新端點
下一篇
Day 26 - 製作 API (五) Book model 相關
系列文
轉職新手學 Django 及 DRF30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言