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

9 Pydantic复杂数据结构的处理

在构建现代 Web 应用时,我们往往需要处理复杂的输入和输出数据结构。例如,响应数据可能包含嵌套字典、列表、元组,甚至是多个嵌套对象。Pydantic 是一个强大的数据验证和序列化库,可以帮助我们轻松地处理这些复杂的数据结构,并通过自定义方法进行验证和转换。

本文将介绍如何使用 Pydantic 处理复杂数据结构,包括嵌套模型、嵌套字典、列表、元组等,及如何使用自定义方法进行数据验证。

1. Pydantic 简介

Pydantic 通过定义 Python 类并继承 BaseModel,使得开发者能够轻松定义数据模型并进行自动验证。Pydantic 支持多种数据类型,包括基本类型(如 intstr 等)和更复杂的类型(如 ListDictTuple、嵌套模型等)。

2. 嵌套模型

2.1 嵌套模型的定义

在许多应用场景中,数据往往具有层级结构。例如,一个订单可能包含多个商品项,每个商品项都有自己的名称、数量和价格。我们可以通过嵌套 Pydantic 模型来处理这种层级结构。

假设我们有以下数据结构:一个订单包含用户信息和多个商品项。我们可以定义两个模型,UserItem,并在 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 模型嵌套了 UserItem 模型。
  • 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 应用时&#xff0c;我们往往需要处理复杂的输入和输出数据结构。例如&#xff0c;响应数据可能包含嵌套字典、列表、元组&#xff0c;甚至是多个嵌套对象。Pydantic 是一个强大的数据验证和序列化库&#xff0c;可以帮助我们轻松地处理这些复杂的数据结构&#…...

springboot+redis实现将树形结构存储到redis

1.pom配置redis <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2.yml文件配置&#xff1a; spring:redis:database: 0host: 1.1.1.1port: 6379timeout:…...

6、使用one-api管理统一管理大模型,并开始使用本地大模型

文章目录 本节内容介绍集中接入&#xff1a;将大模型统一管理起来当使用了大模型代理大模型代理示例 开源模型&#xff1a;如何使用Hugging Face上的模型modelscope使用 pipeline 调用模型用底层实现调用模型流式输出 如何在项目中使用开源模型使用 LangChain使用集中接入开始使…...

Windows安装Lyx

Lyx介绍 LyX 是一个基于 LaTeX 的可视化编辑器&#xff0c;可以让在不编写 LaTeX 代码的情况下使用 LaTeX 的排版功能。 需要依赖Latex环境&#xff0c;如Tex live 或者 MiKTeX Lyx 官网 Lyx官网 安装包下载 点击download默认进入最新版本下载界面 在Recent News/ News里可选…...

一文讲透大模型部署工具ollama--结合本地化部署deepseek实战

Ollama 是一个开源的人工智能平台&#xff0c;专注于在本地高效运行大型语言模型&#xff08;LLMs&#xff09;。通过 Ollama&#xff0c;开发者可以在自己的机器上运行多种大规模语言模型&#xff0c;而不必依赖于云端服务。它支持对大模型的管理和本地化部署&#xff0c;并且…...

网络防御高级

接口配置&#xff1a; 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&#xff0c;选择新建项目 2.左侧选择Django&#xff0c;并设置项目名称 3.查看项目解释器初始配置 4.新建应用程序 执行以下操作之一&#xff1a; 转到工具| 运行manage.py任务或按CtrlAltR 在打开的manage.pystartapp控制台…...

如何定义“破坏环境”

当我们谈论破坏环境时&#xff0c;通常会从人类活动对自然生态造成负面影响的角度来定义。例如&#xff0c;大规模的森林砍伐、工业污染排放、温室气体增加等&#xff0c;都是典型的破坏环境的行为。我们常常看到这些行为导致了生态系统的破坏、物种灭绝、气候变化等问题&#…...

现代前端开发的演进与未来趋势:从工具革新到技术突破

在过去的十年中&#xff0c;前端开发经历了翻天覆地的变化。从最初的静态页面到如今复杂的单页应用&#xff08;SPA&#xff09;&#xff0c;从手动操作 DOM 到基于虚拟 DOM 的高效渲染&#xff0c;从前端“三剑客”&#xff08;HTML/CSS/JS&#xff09;到全栈框架的兴起&#…...

活动预告 |【Part1】Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识

课程介绍 通过参加“Microsoft 安全在线技术公开课&#xff1a;安全性、合规性和身份基础知识”活动提升你的技能。在本次免费的介绍性活动中&#xff0c;你将获得所需的安全技能和培训&#xff0c;以创造影响力并利用机会推动职业发展。你将了解安全性、合规性和身份的基础知识…...

idea Ai工具通义灵码,Copilot我的使用方法以及比较

我用过多个idea Ai 编程工具&#xff0c;大约用了1年时间&#xff0c;来体会他们那个好用&#xff0c;以下只是针对我个人的一点分享&#xff0c;不一定对你适用 仅作参考。 介于篇幅原因我觉得能说上好用的 目前只有两个 一个是阿里的通义灵码和Copilot&#xff0c;我用它来干…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter8-对象、类与面向对象编程

八、对象、类与面向对象编程 ECMA-262 将对象定义为一组属性的无序集合。严格来说&#xff0c;这意味着对象就是一组没有特定顺序的 值。对象的每个属性或方法都由一个名称来标识&#xff0c;这个名称映射到一个值。正因为如此&#xff08;以及其他还未讨论的原因&#xff09;&…...

介绍下SpringBoot常用的依赖项

Spring Boot 是一个用于快速开发 Spring 应用程序的框架&#xff0c;它通过自动配置和依赖管理简化了开发过程。以下是一些 Spring Boot 项目中常用的依赖项&#xff1a; 1. Spring Boot Starter Web 作用: 用于构建 Web 应用程序&#xff0c;包括 RESTful 服务。依赖项: spr…...

深度解析策略模式:从理论到企业级实战应用

一、策略模式的本质&#xff1a;面向接口的算法工厂 策略模式&#xff08;Strategy Pattern&#xff09;是行为型设计模式的典型代表&#xff0c;其核心思想是将算法族抽象为独立对象&#xff0c;使其能够相互替换。这种模式完美体现了以下面向对象设计原则&#xff1a; 开闭原…...

【Linux】深入理解linux权限

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、权限是什么 二、用户和身份角色 三、文件属性 1. 文件属性表示 2. 文件类型 3. 文件的权限属性 四、修改文件的权限属性和角色 1. …...

C++STL(六)——list模拟

目录 本次所需实现的三个类一、结点类的模拟实现构造函数 二、迭代器类的模拟实现为什么有迭代器类迭代器类的模板参数说明构造函数运算符的重载- -运算符的重载和!运算符的重载*运算符的重载->运算符的重载引入模板第二个和第三个参数 三、list的模拟实现3.1 默认成员函数构…...

网络安全与AI:数字经济发展双引擎

在2025年年初&#xff0c;一场科技攻防战引发了全球关注。国产人工智能DeepSeek的爆火&#xff0c;伴随着大规模的网络攻击事件&#xff0c;将网络安全的重要性推上了风口浪尖。 在此背景下&#xff0c;我们计划探讨网络安全与人工智能如何为数字经济发展提供强大动力。网络安…...

WPS接入DeepSeek模型

1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 &#xff08;最好是安装最新的wps&#xff09; 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模块的完整技术方案&#xff0c;采用分步式无线控制架构实现水池液位自动化管理&#xff1a; 一、系统架构设计 硬件部署 山顶单元 GRM241Q模块&#xff08;带4G功能&#xff09; 液位计&#xff08;4-20mA&#xff09; 功能&#xff1a;实时采…...

Windows加域必看:如何用PowerShell一键指定OU路径(附完整代码)

Windows域管理自动化&#xff1a;PowerShell指定OU路径的终极指南 在大型企业IT环境中&#xff0c;计算机加域操作从来不是单次事件&#xff0c;而是需要批量执行的常规运维任务。传统手动操作不仅效率低下&#xff0c;还容易因人为失误导致计算机被放入错误的组织单元(OU)。想…...

vscode如何添加ollama本地模型-实现token自由

vscode一直支持的都是云端闭源的模型&#xff0c;例如 GPT Claude等等&#xff0c;当这些闭源模型的免费额度用完之后&#xff0c;则需要付费继续使用。本文介绍的是vscode接入ollama的本地模型&#xff0c;从而实现token自由。 ollama 首先需要到ollama的官网下载ollama应用…...

Pixel Couplet Gen效果展示:抽象门神像素方块+动态卷轴交互演示

Pixel Couplet Gen效果展示&#xff1a;抽象门神像素方块动态卷轴交互演示 1. 项目概览 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。通过ModelScope大模型驱动&#xff0c;将传统春联创作转化为充满游戏感的数字体验。 核心特点&#xff1a…...

N_m3u8DL-CLI-SimpleG:解决M3U8流媒体下载难题的开源解决方案

N_m3u8DL-CLI-SimpleG&#xff1a;解决M3U8流媒体下载难题的开源解决方案 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG M3U8流媒体格式已成为在线视频传输的主流标准&#xff0…...

Qwen3.5-9B-AWQ-4bitWeb界面使用教程:上传/提问/防重复提交/结果解析全流程

Qwen3.5-9B-AWQ-4bit Web界面使用教程&#xff1a;上传/提问/防重复提交/结果解析全流程 1. 认识Qwen3.5-9B-AWQ-4bit模型 Qwen3.5-9B-AWQ-4bit是一个强大的多模态AI模型&#xff0c;它能够同时理解图片和文字。想象一下&#xff0c;你有一个既会看图片又会回答问题的智能助手…...

FileConverter:重构文件格式转换流程,实现设计师与教育工作者的效率突破

FileConverter&#xff1a;重构文件格式转换流程&#xff0c;实现设计师与教育工作者的效率突破 【免费下载链接】FileConverter File Converter is a very simple tool which allows you to convert and compress files using the context menu in windows explorer. 项目地…...

HG-ha/MTools快速入门:3步部署,体验一体化桌面工具的魅力

HG-ha/MTools快速入门&#xff1a;3步部署&#xff0c;体验一体化桌面工具的魅力 1. 为什么选择MTools&#xff1f;——重新定义桌面生产力 现代开发者和创意工作者常常面临一个困境&#xff1a;需要在十几个专业软件之间来回切换&#xff0c;每个工具都有不同的操作逻辑和系…...

Linux I2C设备驱动避坑指南:以MPU6050为例,详解i2c_transfer与数据读取失败

Linux I2C设备驱动深度调试&#xff1a;MPU6050通信稳定性问题全解析 当你在嵌入式系统中集成MPU6050传感器时&#xff0c;是否遇到过这样的场景&#xff1a;设备树配置正确&#xff0c;驱动代码逻辑清晰&#xff0c;但传感器数据读取却间歇性失败&#xff0c;内核日志中频繁出…...

你的文件真的‘上传’了吗?聊聊阿里云盘‘秒传’背后的隐私与安全考量

你的文件真的“上传”了吗&#xff1f;揭秘秒传技术背后的隐私博弈 第一次在阿里云盘体验“秒传”功能时&#xff0c;那种近乎魔法的速度确实令人惊叹——几个GB的文件眨眼间就完成了“上传”。但惊喜之余&#xff0c;一个更根本的问题浮现出来&#xff1a;我的文件真的被上传了…...

一篇帮你搞定Arrays工具类!!!

一、引言最近在刷算法题的时候&#xff0c;用到了很多次Arrays的方法&#xff0c;因此&#xff0c;写一篇博客来整理一下相关用法二、介绍java.util.Arrays 是 Java 提供的数组操作工具类&#xff0c;包含了数组排序、查找、复制、比较、打印、填充等常用静态方法&#xff0c;无…...