iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0

在第一個 API 中我們編寫的 View,不知道大家有沒有覺得非常簡潔呢,好像沒有寫什麼代碼,但是就完成了 GET, POST 的功能,這就是 Viewset 的威力了。今天就帶大家了解一下 Viewset 在做什麼,以及如何使用!

Viewsets 介紹

在 web 當中有許多常見的功能,以及常使用的邏輯,DRF便將其進行整合進一個 class 方便開發者調用
優點

  • 重複的邏輯可以透過一個 class 進行處理
  • 透過 routers 我們可以省去編寫 urls 路徑的工作。

Viewsets 建立

若要建立,一般我們需要在 class 定義對應的 function

from .models import Products
from .serializers import ProductSerializer
from rest_framework import viewsets
from rest_framework.response import Response

class ProductViewSet(viewsets.ViewSet):
    """
    A simple ViewSet for listing or retrieving users.
    """
    def list(self, request):
        queryset = Products.objects.all()
        serializer = ProductSerializer(queryset)
        return Response(serializer.data)

而 viewset 中自己定義了六種 method ,因此我們只要獲取一次 query 以及 serializer ,Viewset 將會為我們處理好以下 Method 的功能

  • list
  • create
  • retrieve
  • update
  • partial_update
  • destroy

若想要客製化功能,可以透過修改 function 再進行修改

class ProductViewSet(viewsets.ViewSet):
    """
    Example empty viewset demonstrating the standard
    actions that will be handled by a router class.

    If you're using format suffixes, make sure to also include
    the `format=None` keyword argument for each action.
    """

    def list(self, request):
        pass

    def create(self, request):
        pass

    def retrieve(self, request, pk=None):
        pass

    def update(self, request, pk=None):
        pass

    def partial_update(self, request, pk=None):
        pass

    def destroy(self, request, pk=None):
        pass

Viewsets 路徑與 router

viewsets 可以自行定義對應路徑

product_list = ProductViewSet.as_view({'get': 'list'})

但通常我們不會這麼做,我們會透過 router 幫助我們自動對應路徑。

from .views import ProductViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'products', ProductViewSet, basename='product')
urlpatterns = router.urls

router 會自動對應到各個路徑 相關的 Method !

結語

Viewsets 可以幫助我們有效率且清楚的處理許多常見的業務邏輯。Viewsets 按照不同功能,有不同的 Viewsets 可以進行選用,像是 GenericViewSet, ModelViewSet 等。我們越熟習這些工具,有助於我們增進開發的效率以及質量。

參考資料

https://www.django-rest-framework.org/api-guide/viewsets/#viewset


上一篇
[Day18] - Django-REST-Framework API 呼叫及介面操作
下一篇
[Day20] - Django-REST-Framework Serializers 介紹
系列文
使用Django Rest Framework, Docker, Docker Compose 製作後端服務應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言