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

Pydantic 2.*中能否将所有额外字段存入单一字典字段?

在Pydantic 2.*中实现将额外字段存入字典字段的方法

完全可以实现相同的行为,只需适配Pydantic 2.*的API变化即可,具体修改如下:

适配后的代码

from typing import Optional, Dict, Any
from pydantic import BaseModel, model_validator

class A(BaseModel):
    name: str
    extra_columns: Optional[Dict] = None

    @model_validator(mode='before')
    def build_extra(cls, values: Dict[str, Any]) -> Dict[str, Any]:
        # 获取所有非extra_columns的字段别名集合
        all_field_names = {
            field.alias for field in cls.model_fields.values() if field.alias != "extra_columns"
        }

        extra = {}
        # 遍历values的列表副本,避免修改原字典时引发遍历异常
        for field_name in list(values):
            if field_name not in all_field_names:
                extra[field_name] = values.pop(field_name)
        values["extra_columns"] = extra
        return values

# 测试示例
a = A(name="john", age=24, address="Brazil")
print(a)
# 输出:A(name='john', extra_columns={'age': 24, 'address': 'Brazil'})

关键API变化说明

  1. 验证器装饰器替换:Pydantic 2.*中@root_validator(pre=True)被替换为@model_validator(mode='before'),mode='before'表示在字段验证逻辑执行前运行该验证器,与原pre=True效果一致。
  2. 模型字段访问方式变更:原cls.__fields__改为cls.model_fields,用于获取模型定义的所有字段信息。
  3. 默认值优化:给extra_columns设置默认值None,确保未传入额外字段时该字段不会处于缺失状态。

内容的提问来源于stack exchange,提问作者João Pedro Freire Cabral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:27:17