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变化说明
- 验证器装饰器替换:Pydantic 2.*中
@root_validator(pre=True)被替换为@model_validator(mode='before'),mode='before'表示在字段验证逻辑执行前运行该验证器,与原pre=True效果一致。 - 模型字段访问方式变更:原
cls.__fields__改为cls.model_fields,用于获取模型定义的所有字段信息。 - 默认值优化:给
extra_columns设置默认值None,确保未传入额外字段时该字段不会处于缺失状态。
内容的提问来源于stack exchange,提问作者João Pedro Freire Cabral
相关产品推荐
相关产品推荐

