如何为Pydantic Union中的各类型分配不同的Field约束?
给Pydantic Union类型分配专属Field约束的方法
要实现Union中不同类型用不同Field约束,直接给整个Union加Field是不行的(会把约束套给所有类型),正确的做法是用Annotated给每个联合类型单独绑定Field规则:
示例代码
from pydantic import BaseModel, Field, Annotated class FooDetail(BaseModel): baz: int fob: float class Foo(BaseModel): # 仅给str类型绑定pattern约束,FooDetail不受该约束影响 bar: Annotated[str, Field(pattern=r'[bar]+')] | FooDetail
验证逻辑说明
- 当传入字符串类型的
bar时,Pydantic会自动应用pattern=r'[bar]+'的校验规则,只有由b/a/r组成的字符串才会通过 - 当传入符合
FooDetail结构的字典/实例时,会按照FooDetail的模型规则校验,完全不受str的Field约束影响
测试案例
- 合法字符串:
Foo(bar="barrr")→ 验证通过 - 非法字符串:
Foo(bar="abc")→ 触发pattern校验错误 - 合法FooDetail实例:
Foo(bar={"baz": 3, "fob": 5.5})→ 验证通过
内容的提问来源于stack exchange,提问作者rrauenza
相关产品推荐
相关产品推荐

