Contents

在 Django REST Framework 中使用基於類別的視圖來建立 CRUD REST API

Django Rest Framework (DRF) 是一個 Django 框架,為建立 REST API 提供支援。與 Django 一樣,DRF 允許您使用基於函數或基於類別的視圖建立 API 視圖。

雖然基於類別的視圖最初可能會呈現出陡峭的學習曲線,但它們具有多個優點,例如改進的程式碼組織、透過繼承增加的模組化性、增強的可重用性以及表達的簡潔性。

使用 Django REST Framework 建立食譜管理器 API

食譜管理應用程式是探索 Django Rest Framework (DRF) 中基於類別的視圖的絕佳平台。透過結合建立、修改和刪除配方等功能,可以理解 CRUD(建立、讀取、更新、刪除)功能的實作。本指南將指導您透過一系列連續步驟設計 CRUD 介面。

本教程的原始程式碼可以從 GitHub 平台存取和下載,該平台是開發人員以開源儲存庫的形式與其他人協作和共享工作的中心。

第 1 步:安裝 Django REST Framework 並設定您的專案

⭐ 為您的專案建立虛擬環境並安裝以下相依性:

 pip install django djangorestframework

⭐ 使用下列指令建立一個名為 core 的 Django 專案:

 django-admin startproject core .

⭐ 建立一個名為recipe_manager的應用程式:

 python manage.py startapp recipe_manager

⭐ 開啟 core/settings.py 檔案並導航至 INSTALLED_APPS 清單以註冊您的應用程式:

 INSTALLED_APPS = [
    # custom apps
    'rest_framework',
    'recipe_manager',
]

第 2 步:為您的食譜應用程式建立模型

⭐ 打開您的recipe_manager/models.py 檔案並為您的應用程式建立模型。這是配方模型的基本範例:

 # models.py
from django.db import models

class Recipe(models.Model):
    recipe_name = models.CharField(max_length=255)
    ingredients = models.TextField()
    instructions = models.TextField()

⭐ 使用以下命令建立遷移並將模型遷移到資料庫中:

 python manage.py makemigrations && python manage.py migrate

步驟 3:為您的應用程式建立序列化器

序列化器是 Django 框架的一個組成部分,有助於將複雜的資料結構(包括查詢集)轉換為適合渲染的格式,包括 JSON 或 XML 等範例。

若要建立序列化器,請依照下列步驟操作:

⭐建立一個名為recipe_manager/serializers.py的檔案。

⭐ 導入序列化器模組以及要序列化的模型:

 # serializers.py
from rest_framework import serializers

from .models import Recipe # the model to serialize

⭐ 在同一個檔案中,為您的模型建立一個序列化器類別並在其中定義 Meta 類別:

 # serializers.py
class RecipeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Recipe
        fields = ('recipe_name', 'ingredients', 'instructions')

在此程式碼中,Meta 類別定義了要序列化的模型以及序列化程序應處理的特定欄位。 fields 屬性可以是清單或元組。如果你想序列化模型中的所有字段,你可以這樣做:

 class Meta:
 fields = "__all__"

步驟 4:為 CREATE 操作編寫視圖

您可以透過匯入 Django 中可用的通用視圖來為您的應用程式建立基於類別的視圖。你可以從Django的官方文件中閱讀這些視圖。要實作CRUD的CREATE操作,需要匯入CreateAPIView。您還應該導入序列化器和模型:

 # views.py
from rest_framework.generics import CreateAPIView

from .models import Recipe
from .serializers import RecipeSerializer

為了執行使用 REST API 在特定視圖中建立新實體的過程,所需要做的就是指定視圖應採用的特定序列化方法。可以觀察到一個示範性實例如下:

 # Create view
class RecipeCreateView(CreateAPIView):
    serializer_class = RecipeSerializer

使用此配置可​​以執行對應用程式的 POST 請求。

步驟 5:為 READ 操作編寫視圖

⭐ 若要實作 READ 操作,請將 ListAPIView 匯入到您的視圖中。此視圖可協助您列出模型物件:

 # views.py
from rest_framework.generics import CreateAPIView, ListAPIView

⭐ 為您的視圖建立一個類別並指定要使用的序列化器和查詢集:

 # List view
class RecipeListView(ListAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

⭐ 建立一個視圖來閱讀特定的食譜。為此,您需要 RetrieveAPIView,因此將其新增至匯入清單:

 # views.py
from rest_framework.generics import CreateAPIView, ListAPIView, RetrieveAPIView

接下來,建立您需要的視圖:

 # Retrieve view
class RecipeRetrieveView(RetrieveAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

步驟 6:為 UPDATE 和 DELETE 作業編寫視圖

為了執行 UPDATE 和 DELETE 操作,需要利用對應的 API 視圖,即「UpdateAPIView」和「DestroyAPIView」。因此,必須相應地匯入這些視圖。

 from rest_framework.generics import (
    ListAPIView,
    CreateAPIView,
    RetrieveAPIView,
    UpdateAPIView, # new
    DestroyAPIView, # new
)

接下來,我們將實作從 UpdateAPIViewDestroyAPIView 繼承的必要視圖,相應地:

 # Update view
class RecipeUpdateView(UpdateAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

# Delete view
class RecipeDeleteView(DestroyAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

第 7 步:為您的應用程式建立 URL

⭐ 將此程式碼新增至 core/urls.py 以設定您的 URL:

 from django.urls import path, include

urlpatterns = [
    path('api/', include('recipe_manager.urls'))
]

⭐ 將以下程式碼加入您的recipe_manager/urls.py 檔案:

 from django.urls import path
from . import views

urlpatterns = [
    # List view (Read all)
    path('recipes/', views.RecipeListView.as_view(), name='recipe-list'),

    # Create view
    path('recipes/create/', views.RecipeCreateView.as_view(), name='recipe-create'),

    # Retrieve view (Read one)
    path('recipes/<int:pk>/', views.RecipeRetrieveView.as_view(), name='recipe-retrieve'),

    # Update view
    path('recipes/<int:pk>/update/', views.RecipeUpdateView.as_view(), name='recipe-update'),

    # Delete view
    path('recipes/<int:pk>/delete/', views.RecipeDeleteView.as_view(), name='recipe-destroy'),
]

從上面的程式碼中,您將觀察到基於類別的視圖使用 as_view() 函數來建立其 URL 模式。如果您對 Django 中的專案和應用程式的用法感到困惑,您也可以在此處了解它們的差異。

步驟 8:測試您的 API 端點

從您的專案目錄中,執行以下命令:

 python manage.py runserver 

此操作預計會啟動伺服器、執行某些檢查並產生允許遠端存取的網址。

現在您可以透過存取相應的 URI(例如“/api/recipes/”)並使用各種 HTTP 請求方法來執行 CRUD 操作來驗證您的 API 端點。預計您將遇到類似下圖所示的標準使用者介面:

/bc/images/django-s-default-api-testing-interface.jpg

或者,人們可以選擇使用 Postman 應用程式來測試 API 並與 API 交互,而不是使用 Web 瀏覽器。

在建立 CRUD API 時練習 DRY

強烈建議採用稱為“DRY”的程式設計原則,以提高程式碼的整體品質。這項原則代表“不要重複自己”,鼓勵開發人員避免重複程式碼,而是透過重複使用現有元件或在必要時創建新元件來提高效率。透過這樣做,不僅可以節省時間,還可以確保他們的程式碼隨著時間的推移保持一致和可維護。

考慮到前面討論的觀點,值得注意的是,利用 ListCreateAPIView 和 RetrieveUpdateDestroyAPIView 通用視圖可以顯著減少程式碼中的冗餘。

ListCreateAPIView 是 ListAPIView 和 CreateAPIView 的組合,而 RetrieveUpdateDestroyAPIView 將 RetrieveAPIView 的檢索功能與 UpdateAPIView 和 DestroyAPIView 中的更新和刪除功能分別結合。

人們可以透過採用類似於以下範例的佈局來改變他們先前的觀點:

 from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView

from .models import Recipe
from .serializers import RecipeSerializer

class RecipeListCreateAPIView(ListCreateAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

class RecipeRetrieveUpdateDeleteAPIView(RetrieveUpdateDestroyAPIView):
    serializer_class = RecipeSerializer
    queryset = Recipe.objects.all()

利用這種方法可以使編碼結構更加簡潔和精簡,從而最大限度地減少過多程式碼行的累積。

要產生指向新建立的視圖的鏈接,您可以按照以下步驟操作:

 from django.urls import path
from .views import RecipeListCreateAPIView, RecipeRetrieveUpdateDeleteAPIView

urlpatterns = [
    # List and Create view
    path('recipes/', RecipeListCreateAPIView.as_view(), name='recipe-list-create'),

    # Retrieve, Update, and Delete view
    path('recipes/<int:pk>/', RecipeRetrieveUpdateDeleteAPIView.as_view(), name='recipe-retrieve-update-destroy'),
]

您可以使用首選評估這些端點

通用的基於類別的視圖讓您的工作更輕鬆

上面證明了利用通用的基於類別的視圖可以加快建立視圖的過程。目前只需要根據自己的具體應用繼承合適的APIView即可。

建議您遵循合理的程式技術,以防止建立次優程式碼。