如何阻止Pydantic接受嵌套模型中的附加属性

2024-09-28 05:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现下面的反派行为令人惊讶

首先,我创建项,然后使用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]

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

就是这个,

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

变成

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

有没有一种方法可以严格执行items类型,从而

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

变成

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

Tags: 项目fromimport列表属性itemsitemextra
1条回答
网友
1楼 · 发布于 2024-09-28 05:25:38

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

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

相关问题 更多 >

    热门问题