在Django REST Framework中,通用檢視和檢視集都可以用於快速構建REST API。它們各自有不同的適用場景,下面將詳細介紹如何在兩者之間進行選擇。
通用檢視(Generic Views)
通用檢視提供了一些常用的、獨立的檢視類,如 ListCreateAPIView
、RetrieveUpdateDestroyAPIView
等,用於處理增刪改查中的某一種或某幾種功能,適合在以下情況使用:
- 僅需要部分功能:例如,只有列表和建立操作,或只需要更新和刪除操作。
- 檢視邏輯較為簡單:如果你的檢視只負責一種單一的操作(如列出所有資料,或者檢索單個物件),通用檢視就非常合適。
- 對自定義需求較高:通用檢視易於調整和擴充套件,當你需要對特定請求型別進行精細控制時,使用通用檢視能讓程式碼結構更清晰。
示例程式碼
在 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功能,檢視集提供了更便捷的程式碼組織方式。
以上是通用檢視和檢視集的基本適用場景及程式碼示例。