小黑在问题中的日积月累:Pydantic的简单使用
Pydantic 概述
Pydantic 是一个 Python 库,主要用于数据验证和设置管理,通过 Python 类型注解来定义数据模型。它结合了 Python 的类型提示和运行时数据验证,确保数据符合预期格式,常用于 API 开发、配置管理和数据解析。
核心功能
数据验证
Pydantic 模型通过类型注解自动验证输入数据。如果数据不符合类型要求,会抛出清晰的错误信息。
数据转换
自动将输入数据(如 JSON、字典)转换为 Python 对象,支持嵌套模型和复杂类型(如 datetime
、UUID
)。
设置管理
通过 BaseSettings
类管理环境变量和配置,支持优先级排序(如环境变量 > 配置文件 > 默认值)。
与 FastAPI 集成
Pydantic 是 FastAPI 的默认数据模型库,用于请求/响应数据的校验和序列化。
基本用法
定义模型
通过继承 BaseModel
定义数据模型,字段类型使用 Python 类型注解。
from pydantic import BaseModel, ValidationErrorclass User(BaseModel):name:strage:intmail:str
tom = User(name='大黑驴', age=27, mail='ainiyou@163.com')
tom
User(name=‘大黑驴’, age=27, mail=‘ainiyou@163.com’)
数据验证与转换
实例化模型时自动验证数据,非法数据会触发 ValidationError
。 在这里将name变成数字
User(name=111, age=27, mail='ainiyou@163.com')
打印错误信息
try:User(name=111, age=27, mail='ainiyou@163.com')
except Exception as e:print(e.json())
[
{“type”:“string_type”,
“loc”:[“name”],
“msg”:“Input should be a valid string”,
“input”:111,
“url”:“https://errors.pydantic.dev/2.10/v/string_type”
}
]
基本类型自动转化
Pydantic 会自动尝试将输入数据转化为模型中定义的类型。例如,字符串形式的数字会被自动转化为整数或浮点数。
User(name='小黑黑', age='12', mail='ainiyou@163.com')
User(name=‘小黑黑’, age=12, mail=‘ainiyou@163.com’)
邮箱验证
在 Pydantic 中,可以通过 EmailStr 类型或自定义正则表达式来验证邮箱格式。
from typing import Optional
from pydantic import BaseModel, EmailStrclass User(BaseModel):name:strage:intemail:EmailStrphone:Optional[str]=None
User(name='小黑黑', age=22, email='ainiyou@163.com')
User(name=‘小黑黑’, age=22, email=‘ainiyou@163.com’, phone=None)
User(name='小黑黑', age=22, email='ainiyou163.com')
Field 对象参数详解
Field 对象通常用于数据模型或表单验证中,定义字段的约束条件、默认值及其他属性。以下是常见参数的详细说明:
required
表示该字段是必填项。若未提供值且未设置默认值,系统会抛出验证错误。此参数通常用于强制用户输入关键信息。在Pydantic中,Field(...) 等价于 required=True
default
定义字段的默认值。如果用户未提供该字段的值,系统会自动填充此默认值。需注意:
- 默认值为
None
时表示空值。 - 该参数不能与
required=True
同时使用,否则逻辑冲突。
min_length 和 max_length
针对字符串类型字段的长度限制:
min_length
:字符串的最小长度,低于此值会触发验证错误。max_length
:字符串的最大长度,超出此值会触发验证错误。
数值比较参数
适用于数值类型字段(如整数、浮点数)的边界条件:
gt
(greater than):字段值必须大于指定值。ge
(greater than or equal):字段值必须大于或等于指定值。lt
(less than):字段值必须小于指定值。le
(less than or equal):字段值必须小于或等于指定值。
示例代码(以 Python 的 Pydantic 模型为例):
from pydantic import BaseModel, EmailStr, ValidationError, Field
class User(BaseModel):name:str=Field(...,min_length=1, max_length=10)age:int=Field(..., ge=0, le=200)email:EmailStrphone:str=Field(default='18103546785', min_length=11, max_length=11)
try:user = User(name='小黑黑', age=202, email='ainiyou163.com', phone='111111')
except ValidationError as e:print('error:', e.json())
print(user)
error: [
{“type”:“less_than_equal”,
“loc”:[“age”],
“msg”:“Input should be less than or equal to 200”,
“input”:202,"ctx:{“le”:200},
“url”:“https://errors.pydantic.dev/2.10/v/less_than_equal”},{“type”:“value_error”,“loc”:[“email”],“msg”:“value is not a valid email address: An email address must have an @-sign.”,“input”:“ainiyou163.com”,“ctx”:{“reason”:“An email address must have an @-sign.”},“url”:“https://errors.pydantic.dev/2.10/v/value_error”},{“type”:“string_too_short”,“loc”:[“phone”],“msg”:“String should have at least 11 characters”,“input”:“111111”,“ctx”:{“min_length”:11},“url”:“https://errors.pydantic.dev/2.10/v/string_too_short”}]
name=‘小黑黑’ age=22 email=‘ainiyou@163.com’ phone=‘1810546785’
转化为字典
# 转成json
user = User(name='小黑黑', age=22, email='ainiyou@163.com', phone='11111111111')
# 转字典
User.model_dump(user)
{‘name’: ‘小黑黑’, ‘age’: 22, ‘email’: ‘ainiyou@163.com’, ‘phone’: ‘11111111111’}
转化为json
User.model_dump_json(user)
‘{“name”:“小黑黑”,“age”:22,“email”:“ainiyou@163.com”,“phone”:“11111111111”}’