Pydantic 包

942 字
5 分钟
Pydantic 包

  Pydantic 是一个基于 Python 类型提示(Type Hints)的数据验证和解析库。它的核心思想是:通过定义数据模型,自动对输入数据进行类型检查和转换,确保你拿到的数据是干净、合规的。

以下是 Pydantic 的常用功能及举例说明:

🎯 核心功能#

1. 数据模型定义与自动验证#

通过继承 BaseModel 类来定义数据结构。Pydantic 会在创建模型实例时自动进行数据验证和类型转换。

from pydantic import BaseModel, EmailStr, ValidationError
class User(BaseModel):
id: int
name: str
email: EmailStr
is_active: bool = True # 带默认值的可选字段
# 自动类型转换:age 传入字符串 "25",会被自动转换为整数 25
user = User(id=1, name="Alice", email="alice@example.com", is_active=False)
print(user)
# 输出: id=1 name='Alice' email='alice@example.com' is_active=False
# 数据验证失败:会抛出清晰的 ValidationError 异常
try:
invalid_user = User(id="not_an_int", name="Bob", email="bob")
except ValidationError as e:
print(e)

2. 字段约束#

使用 Field 函数可以为字段添加更丰富的约束,如数值范围、字符串长度、正则表达式等。 Field 详细使用教程:[[pydantic 之 Field 使用教程]]

from pydantic import BaseModel, Field, EmailStr
class Product(BaseModel):
# 字符串长度约束
name: str = Field(..., min_length=2, max_length=50, description="产品名称")
# 数值范围约束
price: float = Field(..., gt=0, le=10000, description="价格必须大于0")
# 邮箱格式验证
contact_email: EmailStr
# 正则表达式约束
code: str = Field(..., pattern=r"^P\d{3}$") # 如 P001, P123
product = Product(
name="Laptop",
price=999.99,
contact_email="test@example.com",
code="P001"
)

3. 数据序列化#

模型实例可以轻松地转换为字典或 JSON 字符串,方便数据传输。

# 假设已有上面定义的 Product 模型实例
product_dict = product.model_dump() # 转为字典
print(product_dict)
product_json = product.model_dump_json(indent=2) # 转为格式化的 JSON 字符串
print(product_json)

4. 嵌套模型#

可以将一个 Pydantic 模型作为另一个模型的字段,轻松处理复杂的嵌套数据结构。

from typing import List
class Address(BaseModel):
city: str
street: str
class Order(BaseModel):
order_id: int
items: List[Product] # 嵌套 Product 模型列表
address: Address # 嵌套 Address 模型
# 可以直接使用字典数据进行实例化
order_data = {
"order_id": 1001,
"items": [{"name": "Mouse", "price": 50.0, "contact_email": "a@b.com", "code": "P002"}],
"address": {"city": "Shanghai", "street": "Nanjing Road"}
}
order = Order(**order_data)
print(order.address.city) # 输出: Shanghai

🛠️ 高级用法#

1. 自定义验证器#

当内置的约束无法满足需求时,可以使用 @field_validator 装饰器编写自定义的验证逻辑。

from pydantic import field_validator
class UserWithValidator(BaseModel):
username: str
age: int
@field_validator('username')
@classmethod
def username_no_space(cls, v):
if ' ' in v:
raise ValueError('用户名不能包含空格')
return v
@field_validator('age')
@classmethod
def age_must_be_positive(cls, v):
if v <= 0:
raise ValueError('年龄必须为正数')
return v

2. 高级序列化控制#

model_dump() 方法提供了强大的参数来控制序列化行为,这在 API 开发中非常有用。

  • exclude_unset=True: 只输出用户显式赋值过的字段。这在处理 PATCH 请求(部分更新)时至关重要,可以避免将未提供的字段覆盖为默认值。
  • exclude_none=True: 过滤掉值为 None 的字段,使输出更简洁。
  • by_alias=True: 使用字段定义的别名进行输出。
class UserPatch(BaseModel):
name: str | None = None
email: str | None = None
# 用户只想更新 email
patch_data = UserPatch(email="new@example.com")
# 默认输出包含所有字段
print(patch_data.model_dump())
# {'name': None, 'email': 'new@example.com'}
# 使用 exclude_unset,只输出显式更新的字段
print(patch_data.model_dump(exclude_unset=True))
# {'email': 'new@example.com'}

3. 模型配置#

通过 model_config 可以全局配置模型的行为,例如允许从 ORM 对象属性直接创建模型、设置字段别名生成规则等。

class UserWithConfig(BaseModel):
id: int
name: str
password: str
model_config = {
"from_attributes": True, # 允许 model_validate 从任意对象属性创建实例
"populate_by_name": True, # 允许通过字段名和别名进行赋值
}
# 假设有一个 ORM 对象
class ORMUser:
def __init__(self, id, name, password):
self.id = id
self.name = name
self.password = password
orm_user = ORMUser(1, "Charlie", "secret")
# 可以直接从 ORM 对象创建 Pydantic 模型
pydantic_user = UserWithConfig.model_validate(orm_user)

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Pydantic 包
https://kianzhao.site/posts/python-pydantic/
作者
Kian Zhao
发布于
2026-05-07
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kian Zhao
Hello, I'm Kian Zhao.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
19
分类
6
标签
22
总字数
23,111
运行时长
0
最后活动
0 天前

目录