【问题标题】:How do you stop Pydantic from accepting additional attributes in a nested model如何阻止 Pydantic 接受嵌套模型中的附加属性
【发布时间】:2021-04-22 16:48:12
【问题描述】:

我发现以下 Pydantic 行为令人惊讶。

首先我创建 Item,然后用 ItemExtended 扩展它以包含一个附加属性。现在我创建了 ItemContainer,它可以获取 Items 列表。

from typing import List

from pydantic import BaseModel


class Item(BaseModel):
    thing: int


class ItemExtended(Item):
    extra_thing: int = 456


class ItemContainer(BaseModel):
    items: List[Item]

由于某种原因,如果我现在创建一个 ItemContainer 的实例,传入一个 ItemExtended,而不是将 ItemExtended 转换为一个 Item,它只是被允许,以及不需要的默认值。

即这个

ItemContainer(items=[ItemExtended(thing=123)])

变成

ItemContainer(items=[ItemExtended(thing=123, extra_thing=456)])

有没有办法严格执行项目类型这样的

ItemContainer(items=[ItemExtended(thing=123)])

变成

ItemContainer(items=[Item(thing=123)])

【问题讨论】:

  • 公平点,我可以看到 isinstance(ItemExtended(thing=123), Item) 返回 True 但在严格执行的数据模型的上下文中感觉不对。

标签: python pydantic


【解决方案1】:

您要求做的事情违反了 Python 对打字的看法。 Pydantic 正在做一些直观的事情:您要求它是 Item,而实际上它是 Item。

如果您想对所提供的内容更加严格,请创建一个更严格的子类:

from typing import List

from pydantic import BaseModel


class Item(BaseModel):
    thing: int

class StrictItem(Item):
    pass

class ItemExtended(Item):
    extra_thing: int = 456

class ItemContainer(BaseModel):
    items: List[StrictItem]

不过,我认为您要求自动转换,您可以为其创建验证器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2021-09-06
    • 2022-07-28
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多