Pydantic:存储不是模型一部分的属性(相当于C#中的JsonExtensionData)

p3rjfoxz  于 2022-12-15  发布在  C#
关注(0)|答案(1)|浏览(173)

我正在使用pydantic将数据从json结构加载到MyModel示例中(见下面的例子)。有时JSON数据带有MyModel类中没有定义的额外键。无论如何,我希望在反序列化的MyModel示例中可以访问这些数据。
最小工作示例:

from pydantic import BaseModel

class MyModel(BaseModel):
    """
    MyModel has two attributes: foo and bar
    """
    foo: str
    bar: int

my_json = r'{"foo":"foo value", "bar": 42, "baz": "something else"}'
# my_json has the attributes of MyModel + some extra key/value pair(s): key 'baz' in this case
my_model = MyModel.parse_raw(my_json) # I deserialize it
assert hasattr(my_model, "baz") is True # or something similar

在本例中:是否有办法在反序列化的my_model示例中找到"baz": "something else"键值对?
我知道这种行为存在于其他框架中,例如在C#/.NET中为JsonExtensionData
...任何没有匹配成员的属性都将在反序列化期间添加到该[annotated]字典中,并在序列化期间写入。
pydantic有类似的东西吗?

5t7ly7z5

5t7ly7z51#

是的,这就是model configextra设置的作用,默认设置为ignore,可以设置为allow

from pydantic import BaseModel

class MyModel(BaseModel):
    foo: str
    bar: int

    class Config:
        extra = "allow"

if __name__ == "__main__":
    my_json = '{"foo":"foo value", "bar": 42, "baz": "something else"}'
    my_model = MyModel.parse_raw(my_json)
    assert hasattr(my_model, "baz")
    print(my_model)  # foo='foo value' bar=42 baz='something else'

PS:值得一提的是,没有静态类型检查器能够推断出这个特定的MyModel示例具有baz属性。这意味着没有来自IDE等的my_model.baz自动建议。但我认为这是显而易见的。

相关问题