You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:10:20