在第一個 API 中我們編寫的 View,不知道大家有沒有覺得非常簡潔呢,好像沒有寫什麼代碼,但是就完成了 GET, POST 的功能,這就是 Viewset 的威力了。今天就帶大家了解一下 Viewset 在做什麼,以及如何使用!
在 web 當中有許多常見的功能,以及常使用的邏輯,DRF便將其進行整合進一個 class 方便開發者調用
優點
若要建立,一般我們需要在 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 的功能
若想要客製化功能,可以透過修改 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 可以自行定義對應路徑
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