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

Pydantic 数据验证讲解

文章目录

      • 一、为什么需要 Pydantic?
      • 二、安装
      • 三、基础模型(BaseModel)
      • 四、Field:更精细的控制
      • 五、自定义验证器
        • 1. 字段验证器(`field_validator`)
        • 2. 模型级验证器(`model_validator`)
      • 六、嵌套模型与复杂类型
      • 七、配置管理(pydantic-settings)
      • 八、常用进阶特性速览
      • 九、与 FastAPI 的结合(预告)
      • 十、最佳实践

Pydantic 是 Python 中最流行的数据验证与设置管理库,深度结合类型注解,能自动做类型转换、数据校验、生成文档和序列化。它是 FastAPI 的核心依赖,也广泛应用于配置管理、API 接口、数据处理等场景。

当前主流版本是Pydantic v2(性能大幅提升,API 更清晰)。

一、为什么需要 Pydantic?

传统手动验证:

defcreate_user(data:dict):if"name"notindataornotisinstance(data["name"],str):raiseValueError("name 必须是字符串")if"age"indataand(notisinstance(data["age"],int)ordata["age"]<0):raiseValueError("age 必须是非负整数")# ... 非常繁琐

使用 Pydantic 后:

frompydanticimportBaseModelclassUser(BaseModel):name:strage:intuser=User(name="Alice",age=25)# 自动验证 + 转换print(user.name,user.age)

优点:

  • 声明式,代码简洁
  • 自动类型转换(如"25"25
  • 详细的错误信息
  • 与 IDE / 类型检查器完美配合
  • 支持 JSON 序列化/反序列化
  • 可生成 JSON Schema

二、安装

pipinstallpydantic# 如果需要配置管理pipinstallpydantic-settings

三、基础模型(BaseModel)

frompydanticimportBaseModel,FieldclassUser(BaseModel):name:strage:intemail:str|None=None# 可选字段is_active:bool=True# 默认值# 创建实例(自动验证)user=User(name="Alice",age="25")# 字符串 "25" 会自动转成 intprint(user)# name='Alice' age=25 email=None is_active=Trueprint(user.model_dump())# 转成字典(v2 推荐用法)print(user.model_dump_json())# 转成 JSON 字符串

常用方法(Pydantic v2):

方法作用
model_dump()转成 Python 字典
model_dump_json()转成 JSON 字符串
model_validate()从字典/对象创建并验证
model_validate_json()从 JSON 字符串创建并验证
model_json_schema()生成 JSON Schema

四、Field:更精细的控制

frompydanticimportBaseModel,FieldclassUser(BaseModel):name:str=Field(min_length=2,max_length=50,description="用户名")age:int=Field(gt=0,lt=150,example=25)# gt=大于, lt=小于score:float=Field(default=0,ge=0,le=100)# ge=大于等于tags:list[str]=Field(default_factory=list)# 可变默认值用 default_factorypassword:str=Field(repr=False)# 不在 repr 中显示

常用约束参数:

  • min_length/max_length(字符串、列表等)
  • gt/ge/lt/le(数值)
  • pattern(正则,字符串)
  • default/default_factory
  • descriptionexample(用于文档生成)
  • alias(别名,用于接收/输出不同字段名)

五、自定义验证器

1. 字段验证器(field_validator
frompydanticimportBaseModel,field_validatorclassUser(BaseModel):name:strage:int@field_validator("name")@classmethoddefname_must_not_be_empty(cls,v:str)->str:ifnotv.strip():raiseValueError("姓名不能为空")returnv.strip().title()# 可顺便做转换@field_validator("age")@classmethoddefage_check(cls,v:int)->int:ifv<0:raiseValueError("年龄不能为负数")returnv
2. 模型级验证器(model_validator

用于跨字段校验:

frompydanticimportBaseModel,model_validatorclassRegisterForm(BaseModel):password:strconfirm_password:str@model_validator(mode="after")defcheck_passwords_match(self)->"RegisterForm":ifself.password!=self.confirm_password:raiseValueError("两次密码不一致")returnself

mode="before"在验证前处理原始数据,mode="after"在字段验证后处理。

六、嵌套模型与复杂类型

frompydanticimportBaseModelfromdatetimeimportdatetimeclassAddress(BaseModel):city:strstreet:strclassUser(BaseModel):name:straddress:Address# 嵌套模型tags:list[str]=[]metadata:dict[str,str]={}created_at:datetime user=User(name="Alice",address={"city":"北京","street":"中关村大街"},# 自动转成 Address 对象created_at="2026-08-24T12:00:00"# 自动解析时间)print(user.address.city)# 北京

支持的类型非常丰富:listdictsettupleOptionalUnionLiteral、自定义类等。

七、配置管理(pydantic-settings)

非常适合读取环境变量和.env文件:

frompydantic_settingsimportBaseSettings,SettingsConfigDictclassSettings(BaseSettings):model_config=SettingsConfigDict(env_file=".env",env_file_encoding="utf-8",extra="ignore"# 忽略未定义的环境变量)app_name:str="MyApp"debug:bool=Falsedatabase_url:strmax_connections:int=10settings=Settings()print(settings.database_url)

对应.env文件:

DATABASE_URL=postgresql://user:pass@localhost/db DEBUG=true

八、常用进阶特性速览

特性说明
Literal限制字段只能是特定值
EmailStr邮箱格式验证(需安装email-validator
HttpUrlURL 验证
conint/constr带约束的类型(v2 更推荐用 Field)
ConfigDict模型配置(frozen=True不可变、extra="forbid"禁止额外字段等)
computed_field计算字段
model_serializer自定义序列化逻辑
TypeAdapter不需要完整模型也能验证简单类型

示例(禁止额外字段 + 不可变):

frompydanticimportBaseModel,ConfigDictclassUser(BaseModel):model_config=ConfigDict(extra="forbid",frozen=True)name:strage:int

九、与 FastAPI 的结合(预告)

FastAPI 直接使用 Pydantic 模型做请求体验证和响应序列化:

fromfastapiimportFastAPIfrompydanticimportBaseModel app=FastAPI()classUserCreate(BaseModel):name:strage:int@app.post("/users/")defcreate_user(user:UserCreate):return{"message":f"创建用户{user.name}"}

这就是为什么学 FastAPI 之前强烈建议先掌握 Pydantic。

十、最佳实践

  1. 优先使用类型注解 + Field 约束,少写手动 if 判断
  2. 可变默认值一定要用default_factory
  3. 生产环境建议设置extra="forbid",防止多余字段悄悄进入
  4. 复杂校验优先用field_validator/model_validator
  5. 配置类继承BaseSettings,业务数据模型继承BaseModel
  6. v2 中统一使用model_dump()model_validate()等方法(旧的.dict().parse_obj()已弃用)

🚀 感谢阅读!想了解更多?

📖 我的博客网站 | 记录思考,分享干货
🏡 我的个人主页 | 关于我、开源项目


http://www.cnnetsun.cn/news/4260645.html

相关文章:

  • YOLO目标检测实战:从331张行人车辆数据集入门到部署
  • 充电桩产线 ATE 自动测试系统架构设计:上下料/测试/分拣怎么拼
  • RustFS 加入 NVIDIA Inception:AI 原生存储路线走到哪了
  • 本地LLM硬件需求怎么算?显存内存估算公式与配置指南
  • 2026年数据分类分级产品选型指南:七大厂商解决方案技术评测与行业优选解析
  • 从零构建AI文本检测系统:Wikipedia AI or Not Quiz实战
  • 概率张量分解与函数配准的统一框架:光滑重参数化实战
  • 荒岛求生1.1.6他来啦
  • 李宏毅机器学习课程学习指南:从基础到实战的完整路径
  • AI生成美术素材引争议:游戏团队必须建立流程责任与审查机制
  • Spring代理模式深度解析:从AOP原理到事务模拟实战
  • 从零构建LLM:打通训练与推理全流程的工程实践
  • effective modern C++- item 1: 理解模版类型推导
  • 零基础也能吃透!Python自动化办公全实操教程,告别加班效率翻倍
  • 学习Python图像处理库Pillow
  • 【29册即拍即发】折纸侦探团全系列PDF合集(1-29卷)|高清步骤图+动物/昆虫/人物全覆盖|折纸入门与进阶必备收藏版
  • 14.什么时候用pgvector什么时候单独部署Milvus
  • PCB缺陷检测VOC数据集实战避坑指南
  • 千问 LeetCode 11. 盛最多水的容器 Java实现
  • AI望远镜技术落地:从边缘推理到智能观测自建方案
  • 学术AI技术进阶:单一模型局限性与多模型协同架构在科研全流程的落地价值
  • 打架行为检测数据集:VOC+YOLO双格式2类别实战指南
  • 深入理解C++ std::enable_if_t的用法<一>做为函数返回值
  • 基于CNN的睡眠质量分析系统:从时间序列处理到健康应用实践
  • 同样是写文档,为什么别人图文清爽?
  • OpenRouter深度解析:一个API Key统一调用多模型的工程实践
  • 本地大模型部署显存估算:用计算器搞定GPU选型与KV Cache优化
  • 降ai率指令怎么写?AI降重后怎样做AIGC检测和论文查重?
  • GPT-Image 2 科研绘图的8个专业Prompt,轻松做出顶刊级配图!
  • 技能熵:破解LLM长时程推理评测失真的新指标