9 Pydantic复杂数据结构的处理
在构建现代 Web 应用时,我们往往需要处理复杂的输入和输出数据结构。例如,响应数据可能包含嵌套字典、列表、元组,甚至是多个嵌套对象。Pydantic 是一个强大的数据验证和序列化库,可以帮助我们轻松地处理这些复杂的数据结构,并通过自定义方法进行验证和转换。
本文将介绍如何使用 Pydantic 处理复杂数据结构,包括嵌套模型、嵌套字典、列表、元组等,及如何使用自定义方法进行数据验证。
1. Pydantic 简介
Pydantic 通过定义 Python 类并继承 BaseModel,使得开发者能够轻松定义数据模型并进行自动验证。Pydantic 支持多种数据类型,包括基本类型(如 int、str 等)和更复杂的类型(如 List、Dict、Tuple、嵌套模型等)。
2. 嵌套模型
2.1 嵌套模型的定义
在许多应用场景中,数据往往具有层级结构。例如,一个订单可能包含多个商品项,每个商品项都有自己的名称、数量和价格。我们可以通过嵌套 Pydantic 模型来处理这种层级结构。
假设我们有以下数据结构:一个订单包含用户信息和多个商品项。我们可以定义两个模型,User 和 Item,并在 Order 模型中嵌套这两个模型。
from pydantic import BaseModel
from typing import Listclass Item(BaseModel):name: strquantity: intprice: floatclass User(BaseModel):name: stremail: strclass Order(BaseModel):user: Useritems: List[Item]total_amount: float
在这个例子中:
Order模型嵌套了User和Item模型。items字段是一个Item对象的列表,表示订单中的多个商品项。total_amount字段表示订单总金额。
2.2 使用嵌套模型
我们可以像下面这样创建一个订单对象:
order_data = {"user": {"name": "John Doe", "email": "john.doe@example.com"},"items": [{"name": "Laptop", "quantity": 1, "price": 1200.00},{"name": "Mouse", "quantity": 2, "price": 25.50}],"total_amount": 1251.00
}order = Order(**order_data)
print(order)
输出将是:
user=User(name='John Doe', email='john.doe@example.com')
items=[Item(name='Laptop', quantity=1, price=1200.0), Item(name='Mouse', quantity=2, price=25.5)]
total_amount=1251.0
2.3 嵌套字典和列表
Pydantic 模型也可以处理嵌套字典和列表结构。假设我们有一个场景,其中每个商品项可能包含多个属性,如商品的属性信息。
from typing import Dictclass Item(BaseModel):name: strquantity: intprice: floatattributes: Dict[str, str] # 商品的额外属性class Order(BaseModel):user: Useritems: List[Item]total_amount: float
在这种情况下,attributes 字段是一个字典,存储商品的属性信息,如颜色、尺寸等。
order_data = {"user": {"name": "John Doe", "email": "john.doe@example.com"},"items": [{"name": "Laptop", "quantity": 1, "price": 1200.00, "attributes": {"color": "black", "size": "15 inch"}},{"name": "Mouse", "quantity": 2, "price": 25.50, "attributes": {"color": "red", "wireless": "yes"}}],"total_amount": 1251.00
}order = Order(**order_data)
print(order)
2.4 处理元组和其他数据类型
Pydantic 同样支持验证元组、集合等数据类型。我们可以使用 Tuple 来验证数据。
from typing import Tupleclass Order(BaseModel):user: Useritems: List[Item]total_amount: floatstatus: Tuple[str, str] # 状态元组:订单状态和配送状态
在上面的代码中,status 是一个元组,包含两个字符串,分别表示订单的状态和配送状态。
3. 数据验证的自定义方法
Pydantic 允许我们为模型字段添加自定义验证方法,这使得我们可以根据特定规则对数据进行进一步验证。
3.1 使用 @validator 装饰器进行字段验证
假设我们需要验证订单总金额 total_amount,确保它不小于所有商品项的总价格。我们可以使用 @root_validator 装饰器来实现这个逻辑。
from pydantic import root_validator, ValidationErrorclass Order(BaseModel):user: Useritems: List[Item]total_amount: float@root_validatordef check_total_amount(cls, values):items = values.get('items')total_amount = values.get('total_amount')if items and total_amount:total_price = sum(item.quantity * item.price for item in items)if total_amount < total_price:raise ValueError('Total amount cannot be less than the sum of item prices.')return values
3.2 示例验证
假设我们创建一个订单,其中 total_amount 小于所有商品项的总价格:
order_data = {"user": {"name": "John Doe", "email": "john.doe@example.com"},"items": [{"name": "Laptop", "quantity": 1, "price": 1200.00},{"name": "Mouse", "quantity": 2, "price": 25.50}],"total_amount": 1000.00
}try:order = Order(**order_data)
except ValidationError as e:print(e)
输出将是:
1 validation error for Order
__root__Total amount cannot be less than the sum of item prices. (type=value_error)
Pydantic 会自动执行这个验证,并返回详细的错误信息。
3.3 验证嵌套模型中的数据
你还可以为嵌套的模型添加自定义验证。例如,我们可以确保用户的邮箱地址包含 @ 符号:
class User(BaseModel):name: stremail: str@validator('email')def validate_email(cls, value):if '@' not in value:raise ValueError('Email must contain "@" symbol')return value
这样,如果用户的邮箱地址没有 @ 符号,Pydantic 会自动抛出验证错误。
Pydantic 提供了强大的数据验证功能,帮助开发者轻松处理复杂的输入和输出数据结构。通过嵌套模型、字典、列表、元组等类型的支持,Pydantic 使得数据处理更加灵活和易于管理。同时,自定义的验证方法(如 @validator 和 @root_validator)允许开发者根据业务逻辑定制数据验证规则,确保数据的正确性和一致性。
在使用 Pydantic 时,通过合理的模型设计和验证方法,可以提高代码的可读性、可维护性和健壮性。如果你正在构建需要复杂数据结构验证的应用,Pydantic 是一个非常值得依赖的工具。

相关文章:
9 Pydantic复杂数据结构的处理
在构建现代 Web 应用时,我们往往需要处理复杂的输入和输出数据结构。例如,响应数据可能包含嵌套字典、列表、元组,甚至是多个嵌套对象。Pydantic 是一个强大的数据验证和序列化库,可以帮助我们轻松地处理这些复杂的数据结构&#…...
springboot+redis实现将树形结构存储到redis
1.pom配置redis <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2.yml文件配置: spring:redis:database: 0host: 1.1.1.1port: 6379timeout:…...
6、使用one-api管理统一管理大模型,并开始使用本地大模型
文章目录 本节内容介绍集中接入:将大模型统一管理起来当使用了大模型代理大模型代理示例 开源模型:如何使用Hugging Face上的模型modelscope使用 pipeline 调用模型用底层实现调用模型流式输出 如何在项目中使用开源模型使用 LangChain使用集中接入开始使…...
Windows安装Lyx
Lyx介绍 LyX 是一个基于 LaTeX 的可视化编辑器,可以让在不编写 LaTeX 代码的情况下使用 LaTeX 的排版功能。 需要依赖Latex环境,如Tex live 或者 MiKTeX Lyx 官网 Lyx官网 安装包下载 点击download默认进入最新版本下载界面 在Recent News/ News里可选…...
一文讲透大模型部署工具ollama--结合本地化部署deepseek实战
Ollama 是一个开源的人工智能平台,专注于在本地高效运行大型语言模型(LLMs)。通过 Ollama,开发者可以在自己的机器上运行多种大规模语言模型,而不必依赖于云端服务。它支持对大模型的管理和本地化部署,并且…...
网络防御高级
接口配置: SW2: [sw2]vlan 10 [sw2]vlan 20 [sw2]interface GigabitEthernet 0/0/1 [sw2-GigabitEthernet0/0/1]port link-type trunk [SW2-GigabitEthernet0/0/1]port trunk allow-pass vlan 10 20 [sw2]interface GigabitEthernet 0/0/2 [sw2-GigabitEthernet0/0/…...
使用PyCharm进行Django项目开发环境搭建
如果在PyCharm中创建Django项目 1. 打开PyCharm,选择新建项目 2.左侧选择Django,并设置项目名称 3.查看项目解释器初始配置 4.新建应用程序 执行以下操作之一: 转到工具| 运行manage.py任务或按CtrlAltR 在打开的manage.pystartapp控制台…...
如何定义“破坏环境”
当我们谈论破坏环境时,通常会从人类活动对自然生态造成负面影响的角度来定义。例如,大规模的森林砍伐、工业污染排放、温室气体增加等,都是典型的破坏环境的行为。我们常常看到这些行为导致了生态系统的破坏、物种灭绝、气候变化等问题&#…...
现代前端开发的演进与未来趋势:从工具革新到技术突破
在过去的十年中,前端开发经历了翻天覆地的变化。从最初的静态页面到如今复杂的单页应用(SPA),从手动操作 DOM 到基于虚拟 DOM 的高效渲染,从前端“三剑客”(HTML/CSS/JS)到全栈框架的兴起&#…...
活动预告 |【Part1】Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识
课程介绍 通过参加“Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识”活动提升你的技能。在本次免费的介绍性活动中,你将获得所需的安全技能和培训,以创造影响力并利用机会推动职业发展。你将了解安全性、合规性和身份的基础知识…...
idea Ai工具通义灵码,Copilot我的使用方法以及比较
我用过多个idea Ai 编程工具,大约用了1年时间,来体会他们那个好用,以下只是针对我个人的一点分享,不一定对你适用 仅作参考。 介于篇幅原因我觉得能说上好用的 目前只有两个 一个是阿里的通义灵码和Copilot,我用它来干…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter8-对象、类与面向对象编程
八、对象、类与面向对象编程 ECMA-262 将对象定义为一组属性的无序集合。严格来说,这意味着对象就是一组没有特定顺序的 值。对象的每个属性或方法都由一个名称来标识,这个名称映射到一个值。正因为如此(以及其他还未讨论的原因)&…...
介绍下SpringBoot常用的依赖项
Spring Boot 是一个用于快速开发 Spring 应用程序的框架,它通过自动配置和依赖管理简化了开发过程。以下是一些 Spring Boot 项目中常用的依赖项: 1. Spring Boot Starter Web 作用: 用于构建 Web 应用程序,包括 RESTful 服务。依赖项: spr…...
深度解析策略模式:从理论到企业级实战应用
一、策略模式的本质:面向接口的算法工厂 策略模式(Strategy Pattern)是行为型设计模式的典型代表,其核心思想是将算法族抽象为独立对象,使其能够相互替换。这种模式完美体现了以下面向对象设计原则: 开闭原…...
【Linux】深入理解linux权限
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、权限是什么 二、用户和身份角色 三、文件属性 1. 文件属性表示 2. 文件类型 3. 文件的权限属性 四、修改文件的权限属性和角色 1. …...
C++STL(六)——list模拟
目录 本次所需实现的三个类一、结点类的模拟实现构造函数 二、迭代器类的模拟实现为什么有迭代器类迭代器类的模板参数说明构造函数运算符的重载- -运算符的重载和!运算符的重载*运算符的重载->运算符的重载引入模板第二个和第三个参数 三、list的模拟实现3.1 默认成员函数构…...
网络安全与AI:数字经济发展双引擎
在2025年年初,一场科技攻防战引发了全球关注。国产人工智能DeepSeek的爆火,伴随着大规模的网络攻击事件,将网络安全的重要性推上了风口浪尖。 在此背景下,我们计划探讨网络安全与人工智能如何为数字经济发展提供强大动力。网络安…...
WPS接入DeepSeek模型
1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 (最好是安装最新的wps) 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…...
深度学习之神经网络框架搭建及模型优化
神经网络框架搭建及模型优化 目录 神经网络框架搭建及模型优化1 数据及配置1.1 配置1.2 数据1.3 函数导入1.4 数据函数1.5 数据打包 2 神经网络框架搭建2.1 框架确认2.2 函数搭建2.3 框架上传 3 模型优化3.1 函数理解3.2 训练模型和测试模型代码 4 最终代码测试4.1 SGD优化算法…...
采用分步式无线控制架构实现水池液位自动化管理
以下是基于巨控GRM241Q-4D4I4QHE模块的完整技术方案,采用分步式无线控制架构实现水池液位自动化管理: 一、系统架构设计 硬件部署 山顶单元 GRM241Q模块(带4G功能) 液位计(4-20mA) 功能:实时采…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
