如何阻止 Pydantic 接受嵌套模型中的其他属性

时间:2021-04-22 16:48:12

标签: python pydantic

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

首先我创建 Item,然后使用 ItemExtended 扩展它以包含一个附加属性。现在我创建了 ItemContainer,它可以接受一个项目列表。

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]

出于某种原因,如果我现在创建一个传入 ItemExtended 的 ItemContainer 实例,而不是将 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)])

1 个答案:

答案 0 :(得分:0)

您要求执行的操作违反了 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]

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