四、【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…