pydantic 从 dict 生成模型

Dil*_*ler 9 python pydantic

我最近才开始查看 pydantic 的文档,但我没有看到从 dict 对象生成模型的直接方法。有没有办法生成一个,然后我可以检索并保存以备后用?

这是我拥有的数据示例。

{
    'id': '424c015f-7170-4ac5-8f59-096b83fe5f5806082020',
    'contacts': [{
        'displayName': 'Norma Fisher',
        'id': '544aa395-0e63-4f9a-8cd4-767b3040146d'
    }],
    'startTime': '2020-06-08T09:38:00+00:00'
}
Run Code Online (Sandbox Code Playgroud)

期待一个类似于......的模型

class NewModel(BaseModel):
    id: str
    contacts: list
    startTime: str
Run Code Online (Sandbox Code Playgroud)

小智 46

您还可以使用它的__init__方法:

your_mode = YourMode(**your_dict)
Run Code Online (Sandbox Code Playgroud)

  • 这是关于从头开始创建模型,而不是填充模型。 (3认同)

Ale*_*ing 9

您可以使用MyModel.parse_obj(my_dict)从字典生成模型。根据文件-

这与__init__模型的方法非常相似,除了它采用 dict 而不是关键字参数。

  • 这在最近的版本中已被弃用。建议改用“MyModel.model_validate()”。 (11认同)
  • 那不是问题。 (2认同)
  • 当你也有嵌套类时如何做到这一点?model_validate() 不适合我! (2认同)

SCo*_*vin 7

没有确切的方法,但create_model()如果您知道字段类型,则可以用来创建模型。

或者有datamodel-code-generator(单独的包),它允许您从模式定义生成模型。


小智 6

我使用此方法使用字典定义在运行时生成模型。这种方法也允许您定义嵌套模型。字段类型语法借鉴了 create_model 方法。

from pydantic import create_model
m = {
    "a":(int,...),
    "b":{
        "c":(str,"hi"),
        "d":{
            "e":(bool,True),
            "f":(float,0.5)
        }
    }
}

def dict_model(name:str,dict_def:dict):
    fields = {}
    for field_name,value in dict_def.items():
        if isinstance(value,tuple):
            fields[field_name]=value
        elif isinstance(value,dict):
            fields[field_name]=(dict_model(f'{name}_{field_name}',value),...)
        else:
            raise ValueError(f"Field {field_name}:{value} has invalid syntax")
    return create_model(name,**fields)

model = dict_model("some_name",m)
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您有一个示例 json 并且想要生成一个用于验证的 pydantic 模型并使用它,那么您可以尝试这个网站 - https://jsontopydantic.com/ 它可以从示例 json 生成一个 pydantic 模型