Pydantic 模型

本文将详细介绍 Pydantic 模型BaseModel 的核心概念,并通过实际代码示例如何从零开始编写自己的 Pydantic 模型。


1. Pydantic 是什么?

Pydantic 是一个 Python 库,主要用于:

  • 数据验证:确保输入数据符合预期的类型和约束。
  • 数据解析:将 JSON、字典等原始数据转换为 Python 对象。
  • 文档生成:自动生成 API 文档(如 Swagger/OpenAPI)。
  • 配置管理:安全地加载环境变量或配置文件。

2. BaseModel:所有模型的基类

Pydantic 的所有模型都继承自 BaseModel。它提供了核心功能:

  • 自动验证字段类型。
  • 支持默认值和可选字段。
  • 生成 JSON Schema(用于 API 文档)。

基础示例

from pydantic import BaseModelclass User(BaseModel):name: strage: int# 使用字典初始化
user_data = {"name": "Alice", "age": 25}
user = User(**user_data)  # 自动验证字段类型print(user.name)  # 输出: Alice
print(user.age)   # 输出: 25

3. 如何编写自己的 Pydantic 模型?

(1) 定义字段类型

Pydantic 支持 Python 原生类型和复杂类型:

from typing import Optional, List
from datetime import datetime
import uuidclass Product(BaseModel):id: uuid.UUID                  # UUID 类型name: str                      # 必填字符串price: float                   # 浮点数tags: List[str]                # 字符串列表created_at: datetime           # 日期时间discount: Optional[float] = None  # 可选字段

(2) 添加字段约束

使用 Field 定义更复杂的规则:

from pydantic import BaseModel, Fieldclass User(BaseModel):username: str = Field(..., min_length=3, max_length=20)  # 必填,长度3-20email: str = Field(..., regex=r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")age: int = Field(ge=18, description="必须成年")  # 年龄 ≥ 18

(3) 自定义验证逻辑

通过 @validator 添加自定义验证:

from pydantic import validatorclass Payment(BaseModel):amount: floatcurrency: str@validator("amount")def amount_must_be_positive(cls, v):if v <= 0:raise ValueError("金额必须大于0")return v@validator("currency")def currency_must_be_valid(cls, v):if v not in ["USD", "EUR", "JPY"]:raise ValueError("无效的货币类型")return v

(4) 嵌套模型

模型可以嵌套其他模型:

class Address(BaseModel):city: strstreet: strclass Person(BaseModel):name: straddress: Address  # 嵌套模型# 使用示例
data = {"name": "Bob","address": {"city": "New York", "street": "5th Ave"}
}
person = Person(**data)

4. 高级用法

(1) 配置模型行为

通过 Config 类自定义模型行为:

class ConfigExample(BaseModel):name: strclass Config:anystr_strip_whitespace = True  # 自动去除字符串两端空格allow_population_by_field_name = True  # 允许用别名初始化extra = "forbid"  # 禁止额外字段

(2) 生成 JSON Schema

Pydantic 自动为模型生成 JSON Schema:

print(User.schema_json(indent=2))

输出:

{"title": "User","type": "object","properties": {"username": {"type": "string","minLength": 3,"maxLength": 20},"email": {"type": "string","pattern": "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"},"age": {"type": "integer","minimum": 18,"description": "必须成年"}},"required": ["username", "email", "age"]
}

(3) 与环境变量集成

从环境变量加载配置:

from pydantic import BaseSettingsclass Settings(BaseSettings):api_key: strdebug: bool = Falseclass Config:env_file = ".env"  # 从.env文件加载settings = Settings()  # 自动读取环境变量

5. 完整示例:用户注册 API 模型

from pydantic import BaseModel, Field, EmailStr, validator
from typing import Optional
from datetime import datetimeclass UserRegister(BaseModel):username: str = Field(..., min_length=3, max_length=20)email: EmailStr  # 专门验证邮箱格式的类型password: str = Field(..., min_length=8)birth_date: Optional[datetime] = Nonereferral_code: Optional[str] = Field(None, max_length=10)@validator("password")def password_must_contain_special_char(cls, v):if not any(c in "!@#$%^&*" for c in v):raise ValueError("密码必须包含特殊字符")return v# 使用示例
user_data = {"username": "alice123","email": "alice@example.com","password": "secure!123"
}
user = UserRegister(**user_data)  # 自动验证

6. 常见问题解答

Q1:Pydantic 和 Dataclasses 有什么区别?

  • Pydantic:专注于数据验证和解析,支持复杂约束(如正则、自定义验证)。
  • Dataclasses:仅生成 __init____repr__,无验证功能。

Q2:如何处理未知字段?

通过 Config 控制:

class Config:extra = "allow"   # 允许额外字段(默认)extra = "forbid"  # 禁止额外字段extra = "ignore"  # 忽略额外字段

Q3:性能如何?

Pydantic 在首次运行时会生成验证逻辑的优化代码,后续调用速度接近原生 Python。


总结

功能实现方式
基础字段定义name: str
字段约束Field(..., min_length=3)
自定义验证@validator 装饰器
嵌套模型直接嵌套其他 BaseModel
环境变量集成继承 BaseSettings + Config
生成 API 文档自动通过 schema_json() 或 FastAPI 集成

通过 Pydantic,你可以用极少的代码实现强大的数据验证和转换逻辑,非常适合 API 开发、配置管理和数据处理场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86358.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity智能模型系列】MediaPipeUnityPlugin 实现人脸数据获取

目录 一、MediaPipeUnity 简介 二、MediaPipeUnity 的核心组成 1. Graph 构建系统 2. 解决方案类(Solution) 3. 解释注释Annotation 系统 三、MediaPipeUnity 的典型使用流程 四、典型示例解析 1、案例 Face Detection图形人脸检测 2、案例 Face Detection图形人脸检…

iOS App 上架步骤解析:适合资源有限团队的上架流程与注意事项

对于不少创业型或初创阶段的开发团队来说&#xff0c;人员配置紧凑、设备有限是常态。在这种背景下&#xff0c;完成一次合规、高效的iOS应用发布往往不是技术难点&#xff0c;而是流程协同与资源调配的问题。 我们是一支5人团队&#xff0c;开发一款社交类工具型App&#xff…

Redis雪崩、穿透、击穿原理及解决方案

以下是 Redis 缓存穿透、击穿与雪崩的原理及解决方案的深度解析&#xff0c;结合工业级实践整理&#xff1a; &#x1f50d; ‌一、问题原理与区别‌ ‌问题类型‌‌触发条件‌‌核心特征‌‌危害‌‌缓存穿透‌查询‌不存在的数据‌绕过缓存直击数据库&#xff0c;导致无效查…

DFX 动态重构的概念和实现

DFX 动态重构的概念和实现 背景介绍 本文内容当前仅限于XILINX或者和XILINX具有相同结构的FPGA器件。 FPGA 技术提供了在现场进行编程和重新编程的灵活性&#xff0c;而无需通过重新制造流程来实现设计修改。动态功能交换&#xff08;Dynamic Function eXchange, DFX&#x…

hutool 导出数据报错:org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException

Excel 导出报错 org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : The part /docProps/core.xml failed to be saved in the stream with marshaller org.apache.poi.openxml4j.opc.internal.marsh…

【学习】win 本地部署qwen3

这里写自定义目录标题 环境搭建下载Ollama安装olama修改模型下载位置&#xff08;可以不设置&#xff09;通过ollama下载/启动模型常用命令其他 环境搭建 下载Ollama 安装olama 默认安装位置是c盘 安装到指定位置使用以下命令 OllamaSetup.exe /DIR"d:\Ollama"修改…

python的__init__.py

在此之前先确认一个概念是否弄清 模块命名空间 1. 目录结构 假设你有以下结构&#xff1a; testpkg/__init__.pyfool.pymaybe.py内容如下&#xff1a; fool.py # testpkg/fool.py class Fool:passmaybe.py # testpkg/maybe.py class Maybe:pass__init__.py &#xff08…

四核 A53+工业级存储:移远 SC200L 与 pSLC SD NAND 如何重构 T-BOX 性能边界?

博客目录 一、移远 SC200L&#xff1a;T-BOX 的 “智慧大脑”二、米客方德 MKDN064GIL-ZA T-BOX&#xff1a;数据安全的坚固堡垒三、深度协同&#xff1a;拓展 T-BOX 应用边界 在车联网浪潮席卷而来的当下&#xff0c;T-BOX 作为汽车与外界交互的核心枢纽&#xff0c;其性能优劣…

JavaEE-统一功能处理

拦截器 实现强制登录的功能, 后端程序根据Session来判断⽤⼾是否登录, 但是实现⽅法是⽐较⿇烦的 需要修改每个接⼝的处理逻辑 需要修改每个接⼝的返回结果 接⼝定义修改, 前端代码也需要跟着修改 有没有更简单的办法, 统⼀拦截所有的请求, 并进⾏Session校验呢, 这⾥我们学…

vscode运行c++文件和插件的方法

1.运行c文件全过程 VSCode运行C全教程-CSDN博客 按照以上的操作即可完成正常的配置流程。但是在运行我的文件时&#xff0c;总是出现终端和输出混乱的情况&#xff0c;我想要在终端中进行输入输出的话&#xff0c;需要加一个改动&#xff1a;设置--输入Run In Terminal--勾选…

利用云效实现自动化部署gitee仓库中的项目

本文主要介绍如何利用云效 实现Node项目&#xff08;vue/react....&#xff09;自动化部署 1.准备工作 Git 仓库【Gitee】 云服务器【华为云】 你的项目 2. 创建目录 服务器上创建两个目录 一个专门用来放压缩包&#xff1a; /home/www/dist &#xff08;aaa.tgz bbb.tgz&am…

Flink SourceFunction深度解析:数据输入的起点与奥秘

在Flink的数据处理流程中&#xff0c;StreamGraph构建起了作业执行的逻辑框架&#xff0c;而数据的源头则始于SourceFunction。作为Flink数据输入的关键组件&#xff0c;SourceFunction负责从外部数据源读取数据&#xff0c;并将其转换为Flink作业能够处理的格式。深入理解Sour…

LabVIEW 共享变量通讯方式

在LabVIEW 开发中&#xff0c;共享变量&#xff08;SharedVariable&#xff09;作为实现数据实时交换的关键技术&#xff0c;广泛应用于 LabVIEW、PLC 编程、分布式 SCADA 系统等领域。解析主流共享变量通讯机制的技术原理、性能特性及工程实践中的选型策略。​ 一、Network -P…

Angular进阶之十二:Chrome DevTools+Angular实战诊断指南

引言 最近有一个工单是说用户在使用我们的系统的时候&#xff0c;如果使用某个页面的次数多了以后浏览器就开始变慢甚至卡死崩溃掉。这个问题明显是提示有内存泄露&#xff0c;今天就由这个问题开始分享一些关于内存泄漏的知识。 一、 Web 应用内存泄漏的危害与易忽略性 危害&…

在云服务器上搭建 MinIO 图片存储服务器及 Spring Boot 整合实现图片上传下载

一、MinIO 核心概念 MinIO 是一个高性能的分布式对象存储服务器&#xff0c;兼容 Amazon S3 API&#xff0c;具有以下特点&#xff1a; 高性能&#xff1a;针对存储和检索优化 轻量级&#xff1a;单个二进制文件即可运行 云原生&#xff1a;支持 Kubernetes 部署 S3 兼容&a…

《深入解析:如何通过CSS集成WebGPU实现高级图形效果》

当CSS的细腻笔触遇上WebGPU的磅礴算力&#xff0c;两者如同命运交织的织工&#xff0c;以代码为丝线&#xff0c;在虚拟空间中编织出超越现实维度的灵境。这场融合不再局限于视觉呈现的革新&#xff0c;而是创造出一种能够与用户情感共鸣、突破物理法则束缚的沉浸式数字体验&am…

R 语言科研绘图 --- 环状图-汇总

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

突破限制:实现页面内精准监听 localStorage 变更

突破限制&#xff1a;实现页面内精准监听 localStorage 变更 一、简介二、示例演示三、StorageEvent重构setItem四、CustomEvent自定义事件同一页面不同模块数据同步五、MessageChannel同一页面不同模块数据同步六、BroadcastChannel多窗口数据同步七、CustomEventBroadcastCha…

牛客AI面试破解电销招聘效率与成本双重难题

在电销行业&#xff0c;高流动性与大规模招聘需求长期困扰企业人力资源管理。传统招聘模式下&#xff0c;HR需应对海量简历筛选、多轮面试协调、主观评估偏差等挑战&#xff0c;导致招聘周期长、成本高、人才匹配度低。如何通过技术手段实现精准筛选与效率提升&#xff1f;牛客…

智慧生产管控数字化平台(源码+文档+讲解+演示)

引言 在全球化和信息化的浪潮中&#xff0c;制造业正面临着前所未有的挑战和机遇。智慧生产管控数字化平台应运而生&#xff0c;旨在通过数字化手段优化生产管控的全流程。本文将详细介绍智慧生产管控数字化平台的核心功能、技术架构以及如何通过开源代码实现二次开发&#xf…