使用Pydantic Field时触发ValidationError,求正确使用方法
问题原因与解决方案
你的问题出在Pydantic对别名的默认处理逻辑:当给字段指定alias后,默认只会识别别名作为输入字段名,原字段名color会被忽略,所以传入{'color': 'green'}时,Pydantic会认为必填的yanse字段缺失。
要让模型同时支持原字段名和别名作为输入,需要在模型类上开启对应配置,结合Field的alias使用即可解决问题。
修正后的代码示例(Pydantic v2)
from pydantic import BaseModel, Field class Blackboard(BaseModel): # 开启按原字段名填充的配置 model_config = {'populate_by_name': True} color: str = Field(alias='yanse') class Table(BaseModel): count: int class ClassRoom(BaseModel): blackboard: Blackboard table: Table # 两种输入方式均能正常运行 # 方式1:使用原字段名color classroom1 = ClassRoom(blackboard={'color': 'green'}, table={'count': 20}) print(classroom1.model_dump_json(by_alias=True)) # 输出会使用别名yanse # 方式2:使用别名yanse classroom2 = ClassRoom(blackboard={'yanse': 'blue'}, table={'count': 20}) print(classroom2.model_dump_json()) # 默认输出原字段名color
如果使用Pydantic v1的情况
v1的配置方式略有差异,需在模型类上添加allow_population_by_field_name = True:
from pydantic import BaseModel, Field class Blackboard(BaseModel): allow_population_by_field_name = True color: str = Field(alias='yanse') class Table(BaseModel): count: int class ClassRoom(BaseModel): blackboard: Blackboard table: Table # 实例化无报错 classroom = ClassRoom(blackboard={'color': 'green'}, table={'count': 20}) print(classroom.json(by_alias=True))
关键说明
populate_by_name(v2)/allow_population_by_field_name(v1):开启后模型会同时识别原字段名和别名作为输入。- 输出时,可通过
model_dump_json(by_alias=True)(v2)或json(by_alias=True)(v1)控制是否用别名输出,默认使用原字段名。
内容的提问来源于stack exchange,提问作者Tangming Li
相关产品推荐
相关产品推荐

