设置extra=ignore的Pydantic模型为何从对象实例化后仍含额外属性?
问题解答
核心原因
出现这种情况的关键在于from_attributes=True的配置逻辑,以及Pydantic处理子类模型实例的特殊行为:
from_attributes=True的属性提取逻辑
当模型设置from_attributes=True时,model_validate会直接从输入对象的属性中读取值,而非先将对象转换为字典再验证。对于TestExtended的实例m,它的属性包含父类Test的a和自身新增的b,model_validate会直接读取这些属性。子类转父类时的属性保留机制
由于TestExtended是Test的子类,Pydantic处理这种子类实例向父类实例转换时,会默认保留原实例的所有属性,即使父类设置了extra='ignore'。这是因为Pydantic认为子类实例已经满足父类的字段要求,不会触发extra规则去过滤不属于父类的属性。
验证与解决
如果要让extra='ignore'生效,需要显式将子类实例转换为字典后再验证:
m_1 = Test.model_validate(m.model_dump()) print(m_1) # 输出:a=2
此时model_dump()会把m转换为包含所有字段的字典,Test模型的extra='ignore'规则会正常过滤掉不属于自身的b字段。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

