如何编写Pydantic模型以接受字典字典

2024-09-27 09:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码已修改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上下文中


Tags: 代码fromhellofoobardictclassbasemodel
2条回答

如果您所要做的只是在另一个模型中有一个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())

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

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'}}}

这运行时没有任何错误

请注意,我们还有香蕉,如果您想丢弃它,只需删除即可

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

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]]]]]

相关问题 更多 >

    热门问题