如何让Pydantic自动将Union类型转换为指定单一类型?
实现Pydantic字段自动类型转换
当然可以实现,以下是两种简洁的方案,让Pydantic自动帮你完成类型转换:
方案一:使用字段验证器(Field Validator)
通过@field_validator装饰器定义转换逻辑,在模型实例化时自动处理字段:
from pydantic import BaseModel, field_validator from typing import Union, List class Demo(BaseModel): id: Union[int, str] files: Union[str, List[str]] @field_validator('id') def convert_id_to_str(cls, value): # 无论输入是int还是str,统一转为str return str(value) @field_validator('files') def convert_files_to_list(cls, value): # 输入是单个字符串时转为单元素列表,列表则直接返回 if isinstance(value, str): return [value] return value
方案二:使用Annotated + 后置验证器(Pydantic v2+)
如果想让转换逻辑更复用、代码更整洁,可以用Annotated结合AfterValidator:
from pydantic import BaseModel, AfterValidator from typing import Union, List, Annotated # 定义通用转换函数 def to_str(value) -> str: return str(value) def to_str_list(value) -> List[str]: if isinstance(value, str): return [value] return value class Demo(BaseModel): id: Annotated[Union[int, str], AfterValidator(to_str)] files: Annotated[Union[str, List[str]], AfterValidator(to_str_list)]
测试验证
实例化模型后,字段会自动转换为目标类型:
# 测试整数id和单个文件字符串 demo1 = Demo(id=123, files="report.pdf") print(type(demo1.id)) # 输出: <class 'str'> print(demo1.files) # 输出: ['report.pdf'] # 测试字符串id和文件列表 demo2 = Demo(id="user_456", files=["img.jpg", "data.csv"]) print(type(demo2.id)) # 输出: <class 'str'> print(demo2.files) # 输出: ['img.jpg', 'data.csv']
两种方案都能让你直接访问转换后的字段,完全不需要手动处理类型转换逻辑。
内容的提问来源于stack exchange,提问作者link89
相关产品推荐
相关产品推荐

