Pydantic字段JSON别名无法正常工作

3
我需要为一个 Pydantic 对象指定一个 JSON 别名,但它似乎无法正常工作。
from pydantic import Field
from pydantic.main import BaseModel


class ComplexObject(BaseModel):
    for0: str = Field(None, alias="for")


def create(x: int, y: int):
    print("was here")
    co = ComplexObject(for0=str(x * y))
    return co


co = create(x=1, y=2)
print(co.json(by_alias=True))

这个的输出结果是{"for" : null}而不是{"for" : "2"}
这是真的吗?这么简单的用例怎么会出问题呢?

相关 - snakecharmerb
2个回答

6

你需要使用别名进行对象初始化。 ComplexObject(for=str(x * y)) 然而,在Python中不能像这样使用for,因为它表示循环! 你可以像这样使用:co = ComplexObject(**{"for": str(x * y)})


2
此外,使用保留字如 "for" 或 "map" 是常见的做法,而用 for_ 或 map_ 并在末尾加上下划线是更好的选择。 - Artur Shiriev

2
您可以在 pydantic 模型的 Config 上添加 allow_population_by_field_name=True 值。
>>> class ComplexObject(BaseModel):
...     class Config:
...         allow_population_by_field_name = True
...     for0: str = Field(None, alias="for")
...
>>>
>>> def create(x: int, y: int):
...     print("was here")
...     co = ComplexObject(for0=str(x * y))
...     return co
...
>>>
>>> co = create(x=1, y=2)
was here
>>> print(co.json(by_alias=True))
{"for": "2"}
>>> co.json()
'{"for0": "2"}'
>>> co.json(by_alias=False)
'{"for0": "2"}'
>>> ComplexObject.parse_raw('{"for": "xyz"}')
ComplexObject(for0='xyz')
>>> ComplexObject.parse_raw('{"for": "xyz"}').json(by_alias=True)
'{"for": "xyz"}'
>>> ComplexObject.parse_raw('{"for0": "xyz"}').json(by_alias=True)
'{"for": "xyz"}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接