当前位置: 首页 > article >正文

四、【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) 模型。

相关文章:

四、【API 开发篇 (上)】:使用 Django REST Framework 构建项目与模块 CRUD API

【API 开发篇 】:使用 Django REST Framework 构建项目与模块 CRUD API 前言为什么选择 Django REST Framework (DRF)?第一步:创建 Serializers (序列化器)第二步:创建 ViewSets (视图集)第三步:配置 URLs (路由)第四步…...

python使用pycharm和conda 设置默认使用清华镜像

将步骤分为Conda配置和PyCharm配置两部分。Conda部分包括添加镜像源、调整优先级、更新环境。PyCharm部分需要根据版本说明如何添加镜像源到项目解释器设置中。同时,需要验证配置是否成功,并提醒常见问题,比如路径错误或缓存问题。需要确保引…...

Prometheus+Grafana实现对服务的监控

PrometheusGrafana实现对服务的监控 前言:PrometheusGrafana实现监控会更加全面,监控的组件更多 Prometheus官网 https://prometheus.io/docs/prometheus/latest/getting_started/ Grafana官网 https://grafana.com/docs/ 一、安装PrometheusGrafana 这…...

ARM笔记-ARM伪指令及编程基础

第四章 ARM伪指令及编程基础 4.1 伪指令概述 4.1.1 伪指令定义 人们设计了一些专门用于指导汇编器进行汇编工作的指令,由于这些指令不形成机器码指令,它们只是在汇编器进行汇编工作的过程中起作用,所以被叫做伪指令。 4.1.2 伪指令特征 …...

Python入门手册:Python基础语法

Python是一种简洁、易读且功能强大的编程语言,非常适合初学者入门。无论你是编程新手,还是有一定编程基础但想学习Python的开发者,掌握Python的基础语法都是迈向高效编程的第一步。本文将详细介绍Python的基本语法,包括变量和数据…...

SpringBoot-SpringBoot源码解读

SpringBoot-SpringBoot源码解读 一、Spring Boot启动过程概述 Spring Boot通过一系列的类和机制,简化了Spring应用的启动流程。当你执行SpringApplication.run()时,Spring Boot会自动完成应用的初始化、环境配置、组件加载、自动配置等任务&#xff0c…...

CAD如何导出PDF?PDF如何转CAD?详细教程来了

浩辰CAD看图王是一款功能强大的CAD图纸查看与编辑工具,其核心功能之一便是支持CAD与PDF格式的互转。下面是CAD看图王输出PDF和PDF转CAD功能的详细介绍及操作步骤: 一、输出PDF功能 看图王可以将CAD图纸转换为PDF格式,是文件在不同的设备上显…...

python-数据可视化(大数据、数据分析、可视化图像、HTML页面)

通过 Python 读取 XLS 、CSV文件中的数据,对数据进行处理,然后生成包含柱状图、扇形图和折线图的 HTML 报告。这个方案使用了 pandas 处理数据,matplotlib 生成图表,并将图表嵌入到 HTML 页面中。 1.XSL文件生成可视化图像、生成h…...

el-select中自定义 两组el-option,但是key不一样,并且点击需获取当前整个项的所有属性

当el-select中只有一组el-option &#xff0c; 获取点击的当前项的属性 &#xff0c; el-select 绑定:value-keyid 但是 当el-select中有两组el-option ,每组option的key不一致,如下代码所示 <el-selectv-model"sth" change"choosee":value-key"…...

【笔记】OpenCV的学习(未完)

由于只记关键和不懂的部分 希望做到下次再看这部分笔记就记得 所以用词会非常简练 前向传播 输入数据依次经过模型的各层&#xff0c;按照各层定义的运算规则进行计算&#xff0c;最终得到模型预测输出的过程。 单向的信息流动&#xff0c;不涉及模型参数的更新。 助于思考的…...

多模态大语言模型arxiv论文略读(八十七)

MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文标题&#xff1a;MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文作者&#xff1a;Xiangyu Zhao, Xiangtai Li, Haodong Duan, Haian Huang, Yining Li, Kai Chen, Hua Ya…...

《棒球百科》长寿运动排名·棒球1号位

关于长寿运动的排名&#xff0c;运动长寿秘诀&#xff1a; 一、全球公认的「长寿运动」排名 游泳&#xff08;低冲击、强化心肺&#xff09; 快走/健走&#xff08;每日30分钟降低15%早逝风险&#xff09; 太极拳&#xff08;平衡力减压&#xff0c;哈佛研究称可延缓衰老&am…...

Maven 项目打包时添加本地 Jar 包

在 Maven 项目开发中&#xff0c;我们经常会遇到需要引入本地 Jar 包的场景&#xff0c;比如使用未发布到中央仓库的第三方库、公司内部自定义工具包&#xff0c;或者处理版本冲突的依赖项。本文将详细介绍如何通过 Maven 命令将本地 Jar 包安装到本地仓库&#xff0c;并在项目…...

记录将网站从http升级https

http与https 你知道http是什么吗&#xff0c;那你知道https吗&#xff1f;在进行升级之前我们应该都听说http不安全&#xff0c;要用https&#xff0c;那你知道这是为什么吗&#xff1f; 什么是http&#xff1f; HTTP 是超文本传输协议&#xff0c;也就是HyperText Transfer…...

如何利用 ORM 框架有效防范 SQL 注入攻击

如何利用 ORM 框架有效防范 SQL 注入攻击 1. 引言 在现代 Web 开发中,SQL 注入攻击始终是数据库安全的一大隐患。攻击者利用不安全的 SQL 语句执行恶意操作,可能导致数据库泄露、篡改甚至被完全控制。幸运的是,ORM(对象关系映射)框架为开发者提供了一种更安全、更高效的…...

spark-shuffle 类型及其对比

1. Hash Shuffle 原理&#xff1a;将数据按照分区键进行哈希计算&#xff0c;将相同哈希值的数据发送到同一个Reducer中。特点&#xff1a;实现简单&#xff0c;适用于数据分布均匀的场景。但在数据分布不均匀时&#xff0c;容易导致某些Reducer处理的数据量过大&#xff0c;产…...

免费PDF工具-PDF24V9.16.0【win7专用版】

【百度】https://pan.baidu.com/s/1H7kvHudG5JTfxHg-eu2grA?pwd8euh 提取码: 8euh 【夸克】https://pan.quark.cn/s/92080b2e1f4c 【123】https://www.123912.com/s/0yvtTd-XAHjv https://creator.pdf24.org/listVersions.php...

游戏开发实战(二):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】

文章目录 奇美拉和队列奇美拉被动技能多对多观察者关系实现自定义元类奇美拉基类 管理奇美拉的队列奇美拉队列类心得体会扩展 规则定义工作相关奇美拉相关 奇美拉属性 在本篇博文&#xff0c;我将介绍本项目的整体框架&#xff0c;以及“编码规则”&#xff0c;这些规则保证了本…...

人工智能发展

探秘人工智能领域的热门编程语言与关键知识 在当今科技飞速发展的时代&#xff0c;人工智能已渗透到生活的各个角落&#xff0c;从智能语音助手到精准的推荐系统&#xff0c;从自动驾驶汽车到医疗影像诊断&#xff0c;人工智能正以前所未有的速度改变着世界。而在这背后&#x…...

在Rockchip平台上利用FFmpeg实现硬件解码与缩放并导出Python接口

在Rockchip平台上利用FFmpeg实现硬件解码与缩放并导出Python接口 一、为什么需要硬件加速?二、[RK3588 Opencv-ffmpeg-rkmpp-rkrga编译与测试](https://hi20240217.blog.csdn.net/article/details/148177158)三、核心代码解释3.1 初始化硬件上下文3.2 配置解码器3.3 构建滤镜链…...

Flink集成资源管理器

Flink集成资源管理器 Apache Flink 支持多种资源管理器&#xff0c;主要包括以下几种‌&#xff1a; YARN ResourceManager ‌&#xff1a;适用于使用 Hadoop YARN 作为资源管理器的环境。YARN ResourceManager 负责管理集群中的资源&#xff0c;包括 CPU、内存等&#xff0c;并…...

一周学会Pandas2 Python数据处理与分析-Pandas2数据合并与对比-pd.concat():轴向拼接

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在数据分析中&#xff0c;数据往往分散在多个来源&#xff08;如不同文件、数据库表或API&#xff09;&#xff0c;需…...

安卓原生兼容服务器

安卓原生兼容服务器的定义 安卓原生兼容服务器‌指基于Android系统内核和服务框架构建的服务器环境&#xff0c;能够在不依赖第三方适配层的情况下&#xff0c;直接运行符合Android API规范的服务程序&#xff0c;并满足与其他软硬件组件的协同工作需求。其核心特征体现在以下…...

优化用户体验:拦截浏览器前进后退、刷新、关闭、路由跳转等用户行为并弹窗提示

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 需求 首先列举一下需要拦截的行为&#xff0c;接下来我们逐个实现。 浏览器前进后退标签页刷新和关闭路由跳转 1、拦截浏览器前进后退 这里的实现是核心&#xff0c;涉及到大…...

横川机器人驱动器导入参数教程

连接端口&#xff1a;有分220v和380v&#xff08;刷新多次无效果就重新打开软件&#xff09;升级固件&#xff1a;区分低压版和高压版导入参数&#xff1a;下载参数&#xff0c;下载成功后必须软重启&#xff0c;重新连接确认电机无干涉后相序测试 &#xff08;等待10s&#x…...

大学生创新创业项目管理系统设计——数据库实验九

本实验为自己设计完成&#xff0c;我当年数据库实验得了94分 目录 1.实验目的 2.实验内容和要求 3.实验步骤 4.实验心得 实验九 数据库设计 1.实验目的 掌握数据库设计的过程和方法。 2.实验内容和要求 &#xff08;35&#xff09;大学生创新创业项目管理系统设计 一…...

电磁场与电场、磁场的关系

电磁场与电场、磁场之间存在着深刻的内在联系和统一性关系。这三者共同构成了电磁相互作用的基本框架&#xff0c;是理解电磁现象的关键所在。 电场和磁场实际上是电磁场的两个不同表现形式&#xff0c;它们既相互区别又密切联系。电场主要由静止电荷产生&#xff0c;表现为对…...

Python爬虫实战:研究Newspaper框架相关技术

1. 引言 1.1 研究背景与意义 互联网的快速发展使得新闻信息呈现爆炸式增长&#xff0c;如何高效地获取和分析这些新闻数据成为研究热点。新闻爬虫作为一种自动获取网页内容的技术工具&#xff0c;能够帮助用户从海量的互联网信息中提取有价值的新闻内容。本文基于 Python 的 …...

Kotlin MultiPlatform 跨平台版本的记账 App

前言 一刻记账 KMP (Kotlin MultiPlatform) 跨平台版本今天终于把 Android 和 iOS 进度拉齐了. 之前只有纯 Android 的版本. 最近大半年有空就在迁移代码到 KMP 上 中间学了 iOS 基础知识. xcode 的使用. 跨平台的架构的搭建… 感觉经历了很多很多. 一把辛酸泪 迁移的心路历…...

PIO 中的赋值魔术,MOV 指令

前言 在普通编程语言中&#xff0c;mov 可以理解为“赋值指令”&#xff0c;将一个值从一个地方拷贝到另一个地方。在 RP2040 的 PIO 汇编语言中&#xff0c;mov 同样是数据传递的关键指令&#xff0c;但它操作的是 PIO 独有的几个寄存器。 在 PIO 中&#xff0c;你可以用 mov …...