四、【API 開發篇 (上)】:使用 Django REST Framework 構建項目與模塊 CRUD API

【API 開發篇 】:使用 Django REST Framework 構建項目與模塊 CRUD API

    • 前言
      • 為什么選擇 Django REST Framework (DRF)?
      • 第一步:創建 Serializers (序列化器)
      • 第二步:創建 ViewSets (視圖集)
      • 第三步:配置 URLs (路由)
      • 第四步:在項目 URLconf 中包含 App 的 URLs
      • 第五步:測試 API
    • 總結

前言

還記得我們的架構藍圖嗎?

  • 前端 (Vue3) 負責展示和交互。
  • 后端 API (DRF) 是前后端溝通的橋梁。
  • 后端邏輯 (Django) 處理業務和數據。
  • 數據持久層 (Models/Database) 存儲數據。

今天,我們的重點就是構建中間的“橋梁”——后端 API 層。

為什么選擇 Django REST Framework (DRF)?

在 Django 生態系統中,DRF 是構建 RESTful API 的標準。它提供了一系列強大的工具,可以極大地加速 API 的開發過程:

  • Serializers (序列化器): 輕松地將復雜的 Django 模型對象轉換成 JSON/XML 等格式(用于響應前端),或將接收到的數據反序列化并驗證(用于創建或更新數據)。
  • Views / ViewSets (視圖/視圖集): 處理請求和響應。ViewSets 特別方便,可以將多個相關的視圖邏輯(如列表、詳情、創建、更新、刪除)合并到一個類中。
  • Routers (路由): 自動生成 URL 模式,省去了手動編寫大量 URLconf 的麻煩。
  • Authentication & Permissions (認證和權限): 提供了多種認證和權限機制,方便保護你的 API。
  • Browsable API (可瀏覽的 API): DRF 提供了一個非常友好的網頁界面,可以直接在瀏覽器中測試 API,對于開發和調試非常有用。

第一步:創建 Serializers (序列化器)

Serializers 負責數據的進出轉換。我們需要為 ProjectModule 模型創建對應的序列化器。

api 文件夾下,創建一個新文件 serializers.py
在這里插入圖片描述

打開 api/serializers.py,添加以下代碼:
在這里插入圖片描述

# test-platform/api/serializers.pyfrom rest_framework import serializers
from .models import Project, Module, TestCase # 導入你之前定義的模型class ProjectSerializer(serializers.ModelSerializer):"""項目序列化器"""class Meta:model = Project # 指明要序列化的模型fields = '__all__' # 序列化模型中的所有字段class ModuleSerializer(serializers.ModelSerializer):"""模塊序列化器"""class Meta:model = Module # 指明要序列化的模型# 明確指定需要序列化的字段,包括外鍵 project# 注意:默認情況下,ModelSerializer 序列化外鍵時只會包含關聯對象的 IDfields = ['id', 'name', 'description', 'project', 'create_time', 'update_time']# 也可以用 '__all__', 但明確指定有助于理解# fields = '__all__'

代碼解釋:

  • from rest_framework import serializers: 導入 DRF 的序列化器模塊。
  • from .models import ...: 導入我們在 models.py 中定義的模型。
  • class ProjectSerializer(serializers.ModelSerializer):: 定義一個名為 ProjectSerializer 的類,它繼承自 serializers.ModelSerializerModelSerializer 是 DRF 提供的一個便捷類,可以根據 Django 模型自動生成序列化器的字段。
  • class Meta:: 在序列化器類內部定義一個 Meta 類,用于配置序列化器。
  • model = Project: 指明這個序列化器是為哪個模型服務的。
  • fields = '__all__': 表示序列化該模型的所有字段。你也可以使用一個列表來指定需要序列化的字段,例如 fields = ['id', 'name', 'owner']。對于 ModuleSerializer,我們明確列出了字段,包括了 project 外鍵字段。當序列化時,DRF 默認會顯示外鍵關聯對象的 ID。

第二步:創建 ViewSets (視圖集)

ViewSets 負責處理 HTTP 請求,調用序列化器進行數據轉換,并與數據庫交互。使用 ModelViewSet 可以非常快速地實現 CRUD 操作。

打開 api/views.py 文件,添加以下代碼:
在這里插入圖片描述

# test-platform/api/views.py# from django.shortcuts import render # 這個現在用不到了
from rest_framework import viewsets
from .models import Project, Module, TestCase # 導入模型
from .serializers import ProjectSerializer, ModuleSerializer # 導入序列化器class ProjectViewSet(viewsets.ModelViewSet):"""項目管理視圖集提供項目列表、創建、詳情、更新、刪除等接口"""queryset = Project.objects.all() # 指定視圖集查詢的數據集serializer_class = ProjectSerializer # 指定用于序列化和反序列化的序列化器class ModuleViewSet(viewsets.ModelViewSet):"""模塊管理視圖集提供模塊列表、創建、詳情、更新、刪除等接口"""queryset = Module.objects.all() # 指定視圖集查詢的數據集serializer_class = ModuleSerializer # 指定用于序列化和反序列化的序列化器# TestCaseViewSet 將在下一篇文章中實現,因為它涉及更復雜的序列化和邏輯
# class TestCaseViewSet(viewsets.ModelViewSet):
#     queryset = TestCase.objects.all()
#     serializer_class = TestCaseSerializer

代碼解釋:

  • from rest_framework import viewsets: 導入 DRF 的視圖集模塊。
  • from .models import ...from .serializers import ...: 導入相關的模型和序列化器。
  • class ProjectViewSet(viewsets.ModelViewSet):: 定義一個 ProjectViewSet,繼承自 viewsets.ModelViewSet
  • queryset = Project.objects.all(): 這是 ModelViewSet 所需的關鍵屬性之一。它指定了該視圖集將操作哪些數據集合。這里是所有的 Project 對象。DRF 會根據這個 queryset 來執行列表、詳情等操作。
  • serializer_class = ProjectSerializer: 這是 ModelViewSet 所需的另一個關鍵屬性。它指定了該視圖集使用哪個序列化器來進行數據的輸入驗證和輸出格式化。
  • ModelViewSet 會自動為我們生成以下路由和對應的操作:
    • GET /projects/: 獲取項目列表 (list action)
    • POST /projects/: 創建新項目 (create action)
    • GET /projects/{id}/: 獲取指定 ID 的項目詳情 (retrieve action)
    • PUT /projects/{id}/: 更新指定 ID 的項目 (update action)
    • PATCH /projects/{id}/: 部分更新指定 ID 的項目 (partial_update action)
    • DELETE /projects/{id}/: 刪除指定 ID 的項目 (destroy action)

ModuleViewSet 的原理和 ProjectViewSet 完全一樣,只是操作的對象變成了 Module 模型和 ModuleSerializer

第三步:配置 URLs (路由)

DRF 的 Routers 可以自動幫我們生成 ModelViewSet 對應的 URL 模式。

api 文件夾下,創建一個新文件 urls.py
在這里插入圖片描述

打開 api/urls.py,添加以下代碼:
在這里插入圖片描述

# test-platform/api/urls.pyfrom django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ProjectViewSet, ModuleViewSet # 導入視圖集# 創建一個 DefaultRouter 實例
router = DefaultRouter()# 注冊視圖集
# 第一個參數是 URL 前綴,例如 'projects'
# 第二個參數是視圖集類
# 第三個參數是可選的 basename,用于生成 URL 名稱,通常與 URL 前綴一致
router.register(r'projects', ProjectViewSet, basename='project')
router.register(r'modules', ModuleViewSet, basename='module')# router.urls 會自動生成包含所有注冊的 ViewSet 對應的 URL 模式列表
urlpatterns = [path('', include(router.urls)), # 將 router 生成的 URL 模式包含進來
]

代碼解釋:

  • from rest_framework.routers import DefaultRouter: 導入 DRF 的默認路由類。
  • from .views import ...: 導入我們剛剛創建的視圖集。
  • router = DefaultRouter(): 創建一個路由器實例。DefaultRouter 會自動包含根視圖(顯示所有注冊的 API 列表)和格式后綴模式。
  • router.register(r'projects', ProjectViewSet, basename='project'): 注冊 ProjectViewSet。訪問路徑會以 /projects/ 開頭。例如 /projects/ (列表/創建), /projects/1/ (詳情/更新/刪除 ID 為 1 的項目)。
  • router.register(r'modules', ModuleViewSet, basename='module'): 注冊 ModuleViewSet,訪問路徑以 /modules/ 開頭。
  • urlpatterns = [...]: 定義 URL 模式列表。
  • path('', include(router.urls)): 這一行將路由器自動生成的 URL 模式全部包含進 api 應用的 URLconf 中。因為我們將這個 include 的第一個參數設為 '',所以視圖集注冊時的 URL 前綴(如 projects, modules)會直接跟在應用 URL(例如 api/,我們稍后會在項目 urls.py 中配置)后面。

第四步:在項目 URLconf 中包含 App 的 URLs

最后一步,我們需要在整個 Django 項目的 URL 配置文件 (backend/urls.py) 中,包含我們 api App 的 URL 模式。

打開 test-platform/backend/urls.py 文件:
在這里插入圖片描述

# test-platform/backend/urls.pyfrom django.contrib import admin
from django.urls import path, include # 確保導入了 includeurlpatterns = [path('admin/', admin.site.urls), # Django Admin 的 URLpath('api/', include('api.urls')), # 添加這一行,將所有以 'api/' 開頭的請求轉發到 api.urls 處理
]

代碼解釋:

  • from django.urls import path, include: 確保導入了 include 函數。
  • path('api/', include('api.urls')): 這一行是關鍵。它告訴 Django,任何以 api/ 開頭的 URL 請求都應該“包含”并交給 api 應用下的 urls.py 文件去處理。
  • 結合 api/urls.py 中的 path('', include(router.urls)),最終的完整 URL 路徑會是 /api/projects/, /api/modules/ 等。

第五步:測試 API

后端 API 已經基本搭建好了,現在來驗證一下。

  1. 啟動 Django 開發服務器:
    在終端中 (確保在 test-platform 目錄下,并且 (venv) 已激活),運行:

    python manage.py runserver
    

    在這里插入圖片描述

  2. 訪問 DRF 的可瀏覽 API 界面:
    在瀏覽器中訪問 http://127.0.0.1:8000/api/
    在這里插入圖片描述

    如果看到以上頁面內容,說明 DRF 和路由配置成功了。這個頁面是 DefaultRouter 提供的根視圖,列出了所有注冊的 API 終端 (projects/modules/)。

  3. 測試 Project API:
    點擊 http://127.0.0.1:8000/api/projects/ 鏈接。
    在這里插入圖片描述

    • GET (列表): 你會看到一個獲取項目列表的頁面。如果之前你在 Django Admin 中創建過項目,這里會顯示出來。頁面下方有一個表單,可以用來發送 POST 請求創建新項目。
      在這里插入圖片描述
      在這里插入圖片描述

    • POST (創建): 在頁面下方的表單中填寫項目信息(名稱, 描述, 負責人, 項目狀態),然后點擊 POST 按鈕。如果成功,會返回新創建的項目數據,并在上方列表中刷新顯示。
      在這里插入圖片描述
      在這里插入圖片描述

    • GET (詳情): 在項目列表頁面,點擊某個項目的 URL (例如 http://127.0.0.1:8000/api/projects/1/),可以查看該項目的詳情。
      在這里插入圖片描述

    • PUT/PATCH/DELETE: 在項目詳情頁面,也會有 PUT (完全更新), PATCH (部分更新) 和 DELETE 的表單或按鈕,你可以嘗試修改或刪除項目。

  4. 測試 Module API:
    返回 http://127.0.0.1:8000/api/,點擊 http://127.0.0.1:8000/api/modules/ 鏈接。
    在這里插入圖片描述

    • GET (列表): 查看模塊列表。
    • POST (創建): 創建模塊時,請注意表單中會有 project 字段。你需要填寫該模塊所屬項目的 ID。例如,如果你創建的第一個項目 ID 是 1,那么這里就填寫 1。填寫其他模塊信息(name, description),然后 POST。
    • 測試詳情、更新、刪除操作與 Project 類似。
      在這里插入圖片描述

通過可瀏覽的 API 界面,你可以在不寫任何前端代碼的情況下,方便地驗證你的后端 API 是否按照預期工作。

總結

你已經成功地邁出了后端 API 開發的關鍵一步:

  • ? 理解了 DRF 在構建 API 中的作用和核心組件 (Serializers, ViewSets, Routers)。
  • ? 為 ProjectModule 模型創建了 ModelSerializer
  • ? 使用 ModelViewSet 快速實現了 ProjectModule 的 CRUD 視圖邏輯。
  • ? 利用 DefaultRouter 自動生成了 API 的 URL 模式。
  • ? 在項目 URL 配置中包含了 API App 的 URL。
  • ? 通過 DRF 的可瀏覽 API 界面驗證了你的 API 功能。

現在,你的后端已經能夠響應前端對項目和模塊數據的操作請求了。

在下一篇文章中,我們將繼續 API 開發,但會處理稍微復雜一些的 測試用例 (TestCase) 模型。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82109.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【北京盈達科技】GEO優化中的多模態了解

多模態數據處理領域,“模態”指的是不同類型的數據形式,每種模態都具有獨特的結構和信息表達方式。以下是12種可能的模態類型,這些模態在實際應用中可以根據具體場景進行組合和處理: 1. 文本模態 描述:以文字形式存在…

推進可解釋人工智能邁向類人智能討論總結分享

目錄 一、探索“可解釋人工智能”:AI如何從“黑箱”走向“透明大師” 二、走進可解釋人工智能:讓AI的決策變得透明 (一)幾種常見的特征導向方法 (二)像素級方法 1. 層次相關傳播(LRP&#…

【Qt】Qt 5.9.7使用MSVC2015 64Bit編譯器

環境 Qt版本:5.9.7 VS版本:VS2022 步驟 1、安裝VS2022 三個必選項: a、使用C的桌面開發 b、Windows10 SDK 版本:10.0.18362.0 c、MSVC v140 VS 2015 生成工具 Windows10 SDK安裝完成后,需要增加安裝調試器。 2…

超越OpenAI CodeX的軟件工程智能體:Jules

目前AI編碼代理(coding agent)領域正迅速崛起,Google推出了一款名為Jules的非同步編碼代理(asynchronous coding agent),主要針對專業開發者,與傳統在開發環境中直接輔助編碼的Cursor或Windsurf…

springboot使用xdoc-report包導出word

背景:項目需要使用xdoc-report.jar根據設置好的word模版,自動填入數據 導出word 框架使用 我的需求是我做一個模板然后往里面填充內容就導出我想要的word文件,問了下chatgpt還有百度,最后選用了xdocreport這個框架,主…

CodeBuddy實現pdf批量加密

本文所使用的 CodeBuddy 免費下載鏈接:騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 前言 在信息爆炸的時代,PDF 格式因其跨平臺性和格式穩定性,成為辦公、學術、商業等領域傳遞信息的重要載體。從機密合同到個人隱私文檔&#xff0c…

如何在PyCharm2025中設置conda的多個Python版本

前言 體驗的最新版本的PyCharm(Community)2025.1.1,發現和以前的版本有所不同。特別是使用Anaconda中的多個版本的Python的時候。 關于基于Anaconda中多個Python版本的使用,以及對應的Pycharm(2023版)的使用,可以參考…

STM32F103 HAL多實例通用USART驅動 - 高效DMA+RingBuffer方案,量產級工程模板

導言 《STM32F103_LL庫寄存器學習筆記12.2 - 串口DMA高效收發實戰2:進一步提高串口接收的效率》前陣子完成的LL庫與寄存器版本的代碼,有一個明顯的缺點是不支持多實例化。最近,計劃基于HAL庫系統地梳理一遍bootloader程序開發。在bootloader程…

【數據結構】棧和隊列(上)

目錄 一、棧(先進后出、后進先出的線性表) 1、棧的概念及結構 2、棧的底層結構分析 二、代碼實現 1、定義一個棧 2、棧的初始化 3、入棧 3、增容 4、出棧 5、取棧頂 6、銷毀棧 一、棧(先進后出、后進先出的線性表) 1、…

Vue 3 官方 Hooks 的用法與實現原理

Vue 3 引入了 Composition API,使得生命周期鉤子(hooks)在函數式風格中更清晰地表達。本篇文章將從官方 hooks 的使用、實現原理以及自定義 hooks 的結構化思路出發,全面理解 Vue 3 的 hooks 系統。 📘 1. Vue 3 官方生…

大語言模型 17 - MCP Model Context Protocol 介紹對比分析 基本環境配置

MCP 基本介紹 官方地址: https://modelcontextprotocol.io/introduction “MCP 是一種開放協議,旨在標準化應用程序向大型語言模型(LLM)提供上下文的方式。可以把 MCP 想象成 AI 應用程序的 USB-C 接口。就像 USB-C 提供了一種…

云原生安全之PaaS:從基礎到實踐的技術指南

??「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 云原生安全之PaaS:從基礎到實踐的技術指南 一、基礎概念 PaaS(Platform as a Service)平臺 PaaS是一種云計算服務模型,為開發者提供應用程序的開發、部署和運行環境,涵…

Chrome中http被強轉成https問題

原因:2023年11月1日,chrome發布HTTPS-Upgrades功能,在用戶訪問 http:// 的舊鏈接之后,會自動嘗試跳轉到通過加密的 https:// 協議,訪問該網站。且探測到 https 服務存在也會自動改成 https。 親測兩種方案可行&#x…

Linux 操作文本文件列數據的常用命令

文章目錄 Linux 操作文本文件列數據的常用命令基本列處理命令高級列處理列數據轉換和排序列數據統計和分析 Linux 操作文本文件列數據的常用命令 Linux 提供了多種強大的命令來處理文本文件中的列數據,以下是一些最常用的命令和工具: 基本列處理命令 c…

如何理解線性判別分析(LDA)算法?

在高維數據空間中,特征變量呈指數級增長,信息分布密集且復雜。研究者在面對海量特征時,仿佛置身于一幅結構高度抽象且維度交織的多變量圖景之中,其解析與建模猶如在一幅復雜的數據宇宙圖譜中導航,既需理論框架的指引,也依賴于算法工具的精確刻畫。如何從眾多維度中篩選出…

鴻蒙UI開發——Builder函數的封裝

1、問題引入 我們在開發中可能會遇到這樣一個問題:將一個Builder修飾后的函數用變量或者數組記錄下來,在業務其他地方使用這些Builder函數。 舉個例子,有下面一段代碼: Builderfunction builderElement() {}let builderArr: Fu…

ARM筆記-ARM指令集

第三章 ARM指令集 3.1 ARM指令集簡介 ARM微處理器的ARM指令集 ,所有的指令長度都是32位 ,并且大多數指令都在一個單獨指令周期內執行。 主要特點: 指令是條件執行的ARM微處理器的指令集是加載/存儲型的在多寄存器操作指令中一次最多可以完成…

Spring Boot接口通用返回值設計與實現最佳實踐

一、核心返回值模型設計(增強版) package com.chat.common;import com.chat.util.I18nUtil; import com.chat.util.TraceUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter;import java.io.Serializable;/*** 功能: 通…

2025年上半年軟件架構師考試回憶版【持續更新】

文章目錄 案例分析1、端AI相對于云AI的優勢2、redis持久化,主從庫3、解釋器架構風格4、知識圖譜5、區塊鏈 論文1、基于事件驅動的模型2、多模型數據庫及其應用3、負載均衡設計方法4、論軟件測試理論及其應用 考試感受 2025年軟件考試架構考試于5月24日如期舉行&…

Windows下編譯Zipios

本文記錄在Windows下編譯Zipios的流程。 注1:文章內容會不定期更新。 零、環境 操作系統Windows 11VS Code1.92.1Git2.34.1Visual StudioVisual Studio Community 2022CMake3.22.1 一、安裝依賴 二、編譯 2.1 下載代碼 git clone https://github.com/Zipios/Zi…