Pydantic 对象没有属性 '__fields_set__' 错误

Bru*_*noX 8 python pydantic fastapi

我正在使用 FastAPI 创建一个非常简单的虚拟 API。为此,我使用枚举来定义发布请求的需求主体,并模拟从 API 方法到虚拟方法的数据库调用。

为了在我的端点上有正确的主体请求,我在类定义上使用 Pydantic 的 BaseModel 但由于某种原因我收到此错误

File "pydantic/main.py", line 406, in pydantic.main.BaseModel.__setattr__ 
AttributeError: 'MagicItem' object has no attribute '__fields_set__'
Run Code Online (Sandbox Code Playgroud)

我不确定问题是什么,这是生成所有这些的代码:

在此输入图像描述

在此输入图像描述

在此输入图像描述

我现在有点迷失了,因为我没有在如此简单的代码中看到错误。

Dan*_*erg 15

你基本上完全放弃了BaseModel.__init__你的MagicItem. 一般来说,如果您绝对必须重写基本模型的初始化方法(在您的情况下,您不需要),您至少应该在自己的内部调用它,如下所示:

super().__init__(...)
Run Code Online (Sandbox Code Playgroud)

Pydantic 在 init 方法中发挥了很多作用。其中之一就是__fields_set__属性的设置。这就是您收到该错误的原因。

我建议完全删除您的自定义__init__方法。

使用 Pydantic 模型的主要好处之一是您不必担心编写这样的样板文件。查看他们的文档,我认为这非常好。

附:

如果您坚持这样做是因为您希望能够使用位置MagicItem参数来初始化您的变量,您可以这样做:

class MagicItem(BaseModel):
    name: str
    damage: Damage

    def __init__(self, name: str, damage: Damage) -> None:
        super().__init__(name=name, damage=damage)
Run Code Online (Sandbox Code Playgroud)