【问题标题】:How to write a Pydantic model to accept a Dictionary of Dictionaries如何编写 Pydantic 模型以接受字典词典
【发布时间】:2021-03-07 12:15:22
【问题描述】:

以下代码修改from the Pydantic documentation 我想知道如何更改BarModelFooBarModel,以便他们接受分配给m1 的输入。我尝试过使用__root__Dict[str, BarModel] 等语法,但一直找不到神奇的组合。

from pydantic import BaseModel

class BarModel(BaseModel):
    whatever: float
    foo: str

class FooBarModel(BaseModel):
    banana: str
    bar: BarModel

m = FooBarModel(banana='a', bar={'whatever': 12.3, 'foo':'hello'})
m1 = FooBarModel({
  'a':{'whatever': 12.3, 'foo':'hello'},
  'b':{'whatever': 12.4, 'foo':'bye'}
})

print(m.dict())   # returns a dictionary:
print(m1.dict())  # TypeError

最终解决方案将部署在 FastAPI 上下文中。

【问题讨论】:

标签: python fastapi pydantic


【解决方案1】:

如果您想要做的只是在另一个模型中拥有一个包含 BarModel 的字典,这可以回答您的问题:

from typing import Dict
from pydantic import BaseModel

class BarModel(BaseModel):
    whatever: float
    foo: str

class FooBarModel(BaseModel):
    dictionaries: Dict[str, BarModel]

m1 = FooBarModel(dictionaries={
    'a': {'whatever': 12.3, 'foo': 'hello'},
    'b': {'whatever': 12.4, 'foo': 'bye'}
}

print(m1.dict())

【讨论】:

  • 这对我有用。我还意识到使用 root 我的原始数据可以在没有关键字参数的情况下传入。在 FastAPI 中如何导出 BarModel 仍然存在问题,但我正在慢慢解开这些碎片。再次感谢。
【解决方案2】:

你已经找到了你的魔法组合,你还没有意识到。

from pydantic import BaseModel
from typing import Dict

class BarModel(BaseModel):
    whatever: float
    foo: str

class FooBarModel(BaseModel):
    banana: str
    bar: Dict[str, BarModel]


m1 = FooBarModel(banana="a", bar={
  'a':{'whatever': 12.3, 'foo':'hello'},
  'b':{'whatever': 12.4, 'foo':'bye'}
})

assert m1.dict() == {'banana': 'a', 'bar': {'a': {'whatever': 12.3, 'foo': 'hello'}, 'b': {'whatever': 12.4, 'foo': 'bye'}}}

这运行没有任何错误。

注意我们还有banana,如果要丢弃,直接删除即可。

如果您想使用纯类型和一些静态分析器,您的示例将对此进行评估

from typing import Dict, Union
m = FooBarModel(banana='a', bar={'whatever': 12.3, 'foo':'hello'})


m: Dict[str, Union[str, Dict[str, Union[float, str]]]]

但你想要的其实是这个

from typing import Dict, Union

m1 = FooBarModel({
  'a':{'whatever': 12.3, 'foo':'hello'},
  'b':{'whatever': 12.4, 'foo':'bye'}
})

m1: Dict[str, Union[str, Dict[str, Dict[str, Union[float, str]]]]]

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2021-03-05
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2021-11-26
    • 2021-12-11
    相关资源
    最近更新 更多