Python 如何阻止Pydantic接受嵌套模型中的附加属性
我发现下面的反派行为令人惊讶 首先,我创建项,然后使用ItemExtended对其进行扩展,以包含一个附加属性。现在我创建了ItemContainer,它可以获取项目列表Python 如何阻止Pydantic接受嵌套模型中的附加属性,python,pydantic,Python,Pydantic,我发现下面的反派行为令人惊讶 首先,我创建项,然后使用ItemExtended对其进行扩展,以包含一个附加属性。现在我创建了ItemContainer,它可以获取项目列表 from typing import List from pydantic import BaseModel class Item(BaseModel): thing: int class ItemExtended(Item): extra_thing: int = 456 class ItemC
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,那么它只是被允许的,还有不需要的默认值
i、 e.这个
ItemContainer(items=[ItemExtended(thing=123)])
ItemContainer(items=[ItemExtended(thing=123)])
变成
ItemContainer(items=[ItemExtended(thing=123, extra_thing=456)])
ItemContainer(items=[Item(thing=123)])
有没有一种方法可以严格执行items类型,从而
变成
ItemContainer(items=[ItemExtended(thing=123, extra_thing=456)])
ItemContainer(items=[Item(thing=123)])
您要求执行的操作违反了Python对键入的思考。Pydantic正在做一些直观的事情:你要求它是一个
项目
,事实上,它是一个项目
如果您想严格要求所提供的内容,请创建一个更严格的子类:
输入导入列表中的
从pydantic导入BaseModel
类别项(基本模型):
事物:int
类别项目(项目):
通过
类项扩展(项):
额外的东西:int=456
类ItemContainer(BaseModel):
项目:列表[项目]
但是,我认为您要求的是自动转换,您可以为其创建一个验证器。您知道吗?公平点,我可以看到
isinstance(ItemExtended(thing=123),Item)
返回True
,但在严格执行数据模型的上下文中,它感觉是错误的。