我的问题是,当我使用.dict遍历模型实例时,引用其他模型的字段值被转换为字典,例如:

from pydantic import BaseModel


class Model(BaseModel):
    attr: str


class AnotherModel(BaseModel):
    attr: str
    model_attr: Model


model = AnotherModel(attr="test", model_attr=Model(attr="something"))

# field values are model objects
for field in model:
    print(field)

# field values are dictionaries
for key, val in model.dict().items():
    print((key, val))

为什么会这样?我怎样才能改变它?

推荐答案

在调用BaseModel.dict方法时

子模型将被递归地转换为词典.

这是意料之中的行为.

request made here分可以增加一个选项,让它变成non-recursive分,但被拒绝了.

目前,最简单的解决方案是只使用iterable协议implemented by BaseModel并简单地将其强制转换为dict,或者首先使用_iter方法进行更细粒度的控制(例如,排除未设置的字段或返回字段别名):

from pydantic import BaseModel


class Foo(BaseModel):
    x: int


class Bar(BaseModel):
    y: float
    foo: Foo


bar = Bar(y=3.14, foo=Foo(x=0))
print(bar.dict())         # {'y': 3.14, 'foo': {'x': 0}}
print(dict(bar))          # {'y': 3.14, 'foo': Foo(x=0)}
print(dict(bar._iter()))  # {'y': 3.14, 'foo': Foo(x=0)}

从皮丹蒂克v2开始,您可能会使用model_dump而不是dict方法.而the plan似乎也允许倾销

没有转换的模型的字段值,有效值为model.__dict__[...].

因此,拨打bar.model_dump(mode="unchanged")基本上就是你想要的.但我还不确定这是否稳定.

Python相关问答推荐

如何从同一类的多个元素中抓取数据?

螺旋桨图上意外颠倒的次y轴

已安装' owiener ' Python模块,但在导入过程中始终没有名为owiener的模块

具有2D功能的Python十六进制图

Twilio:CallInstance对象没有来自_的属性'

给定数据点,制定它们的关系

如何将Matplotlib的fig.add_axes本地坐标与我的坐标关联起来?

当值是一个integer时,在Python中使用JMESPath来验证字典中的值(例如:1)

数字梯度的意外值

如何防止Plotly在输出到PDF时减少行中的点数?

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

沿着数组中的轴计算真实条目

如何访问所有文件,例如环境变量

无法通过python-jira访问jira工作日志(log)中的 comments

发生异常:TclMessage命令名称无效.!listbox"

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

计算每个IP的平均值

如何在UserSerializer中添加显式字段?

如何使用OpenGL使球体遵循Python中的八样路径?

Numpyro AR(1)均值切换模型抽样不一致性