Pydantic:校验器(@validator)、模型嵌套、模型继承
📚 1. 校验器(@validator)
Pydantic 允许你自定义字段验证逻辑。用 @validator
装饰器可以在字段赋值时自动进行检查或修改。
例子:
from pydantic import BaseModel, validatorclass User(BaseModel):name: strage: int@validator('name')def name_must_not_be_empty(cls, v):if not v.strip():raise ValueError('Name must not be empty')return v.title() # 自动转为首字母大写@validator('age')def age_must_be_positive(cls, v):if v <= 0:raise ValueError('Age must be positive')return v
用法说明:
@validator('字段名')
作用于特定字段。- 方法的第一个参数是
cls
(类本身),第二个是字段值v
。 - 你可以抛出异常来阻止非法数据。
- 你也可以对值做一些小改动(比如格式化字符串)。
🧩 2. 模型嵌套(Model Nesting)
Pydantic 支持模型里嵌套模型,非常适合表示复杂的数据结构。
例子:
from pydantic import BaseModelclass Address(BaseModel):city: strzip_code: strclass User(BaseModel):name: straddress: Addressuser = User(name='Tom',address={'city': 'New York','zip_code': '10001'}
)print(user.address.city) # 自动解析成 Address 类型
用法说明:
- 在外部模型中,直接把字段的类型定义为另一个
BaseModel
子类。 - 输入时可以直接传字典,Pydantic 会自动转成子模型。
🏗️ 3. 模型继承(Model Inheritance)
Pydantic 的模型支持继承,就像 Python 的普通类一样。
你可以用基类定义通用字段,然后子类扩展或修改。
例子:
from pydantic import BaseModelclass Person(BaseModel):name: strage: intclass Employee(Person):employee_id: strclass Manager(Employee):department: strm = Manager(name='Alice', age=30, employee_id='E123', department='HR')print(m)
用法说明:
- 子类会继承父类的所有字段。
- 可以继续添加新的字段或重写验证逻辑。
- 适合复杂系统中统一管理基础字段,比如 “用户通用信息”、“商品通用信息”。
🔥 总结一句话:
@validator 用来自定义字段验证,模型嵌套用来组合结构复杂的数据,模型继承用来复用字段和逻辑。