選擇使用通用檢視(Generic Views)或檢視集(ViewSets)

林汉州win發表於2024-10-31

在Django REST Framework中,通用檢視檢視集都可以用於快速構建REST API。它們各自有不同的適用場景,下面將詳細介紹如何在兩者之間進行選擇。

通用檢視(Generic Views)

通用檢視提供了一些常用的、獨立的檢視類,如 ListCreateAPIViewRetrieveUpdateDestroyAPIView 等,用於處理增刪改查中的某一種或某幾種功能,適合在以下情況使用:

  • 僅需要部分功能:例如,只有列表和建立操作,或只需要更新和刪除操作。
  • 檢視邏輯較為簡單:如果你的檢視只負責一種單一的操作(如列出所有資料,或者檢索單個物件),通用檢視就非常合適。
  • 對自定義需求較高:通用檢視易於調整和擴充套件,當你需要對特定請求型別進行精細控制時,使用通用檢視能讓程式碼結構更清晰。

示例程式碼

views.py 中定義兩個通用檢視:

from rest_framework import generics
from .models import Snippet
from .serializers import SnippetSerializer

class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

urls.py 中手動配置路由:

from django.urls import path
from .views import SnippetList, SnippetDetail

urlpatterns = [
    path('snippets/', SnippetList.as_view(), name='snippet-list'),          # 用於列出和建立
    path('snippets/<int:pk>/', SnippetDetail.as_view(), name='snippet-detail'),  # 用於檢索、更新和刪除
]

檢視集(ViewSets)

檢視集將多個檢視邏輯(如列出、建立、檢索、更新、刪除)組合在一個類中。適合以下情況:

  • 需要完整的CRUD功能:如果API端點需要支援所有的增刪改查功能,使用檢視集會更簡潔高效。
  • RESTful API風格的規範路由:使用 router 可以自動生成規範的RESTful路由,簡化程式碼。
  • 程式碼簡潔且重用性高:檢視集可以大大減少檢視程式碼數量,並透過配置 router 實現自動化路由。

示例程式碼

views.py 中定義一個檢視集:

from rest_framework import viewsets
from .models import Snippet
from .serializers import SnippetSerializer

class SnippetViewSet(viewsets.ModelViewSet):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

urls.py 中使用 router 自動生成路由:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import SnippetViewSet

router = DefaultRouter()
router.register(r'snippets', SnippetViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

如何選擇?

  • 如果只需要部分API操作,例如只需要列表和建立,或只需要檢索和更新,那麼選擇通用檢視
  • 如果需要完整的CRUD操作且希望使用自動化路由,選擇檢視集,因為檢視集將所有CRUD操作合併在一起,同時結合router可以生成RESTful風格的路由。
  • 自定義需求較多時,使用通用檢視有助於更細緻地控制不同請求的處理邏輯;而對於較簡單的CRUD功能,檢視集提供了更便捷的程式碼組織方式。

以上是通用檢視和檢視集的基本適用場景及程式碼示例。

相關文章