如何将Pydantic模型中的文件路径字段就地转换为解析模型?
解决方案
要实现将文件路径字段替换为解析后的FirstModel实例,核心思路是通过字段验证器提前处理输入的文件路径,将其解析为目标模型实例后再赋值给字段。以下是具体实现:
Pydantic v2 实现
from pydantic import BaseModel, FilePath, field_validator import json class FirstModel(BaseModel): str_data: str num_list: list[int | float] class SecondModel(BaseModel): some_other_field: str first_model: FirstModel # 字段类型直接设为目标模型 @field_validator('first_model', mode='before') def load_first_model_from_file(cls, value): # 若输入是文件路径(字符串或FilePath对象),读取并解析 if isinstance(value, (str, FilePath)): with open(value, 'r', encoding='utf-8') as f: file_data = json.load(f) return FirstModel(**file_data) # 若已是FirstModel实例,直接返回 return value
Pydantic v1 实现
如果使用Pydantic v1,验证器写法略有不同:
from pydantic import BaseModel, FilePath, validator import json class FirstModel(BaseModel): str_data: str num_list: list[int | float] class SecondModel(BaseModel): some_other_field: str first_model: FirstModel @validator('first_model', pre=True) def load_first_model_from_file(cls, value): if isinstance(value, (str, FilePath)): with open(value, 'r', encoding='utf-8') as f: file_data = json.load(f) return file_data # v1中pre验证器返回字典,会自动解析为FirstModel return value
效果验证
调用模型时传入文件路径,即可得到预期结果:
>>> SecondModel(some_other_field="Other field data", first_model="path/to/data.json") SecondModel(some_other_field='Other field data', first_model=FirstModel(str_data='Some string data up in here', num_list=[1, 2, 3.14]))
关键说明
- 字段类型直接声明为
FirstModel,保证类型安全; - 验证器通过
mode='before'(v2)或pre=True(v1)优先处理输入,将文件路径转换为模型实例; - 兼容直接传入
FirstModel实例的场景,不破坏原有功能。
内容的提问来源于stack exchange,提问作者howardj99
相关产品推荐
相关产品推荐

