Pydantic模型在FastAPI中是一种良好的实践。

4

我正在使用FastAPI构建REST API,非常喜欢这个工具,特别是它与Pydantic和OpenAPI的集成。

例如,我可以编写一个端点所需的模型,如下所示:

class Model(BaseModel):
    field1: str = Field(default=...)
    field2: int = Field(default=...)
    field3: List[int] = Field(default=...)
    field4: float = Field(default=...)
    class Config:
        schema_extra = {
            "example": {
                'field1': 'example 1',
                'field2': 1,
                'field3': [1, 2],
                'field4': 1.3,
            }
        }

我发现我的代码存在许多重复,例如如果我想创建另一个从Model继承的类来添加另一个字段field5,我需要重新编写Config类以便定义新的示例。

有没有一种好的方法可以解决这个问题?例如,是否有任何工具允许您定义所有属性和示例的字段,然后从它所需的定义中创建Model类?

或者任何其他更适合此情况的模式也是受欢迎的。

2个回答

4
您可以创建一个基础模式扩展,并在每个实例中进行修改:
base_schema_extra = {
    "example": {
        'field1': 'example 1',
        'field2': 1,
        'field3': [1, 2],
        'field4': 1.3,
    }
}

class Model(BaseModel):
    field1: str = Field(default=...)
    field2: int = Field(default=...)
    field3: List[int] = Field(default=...)
    field4: float = Field(default=...)

    class Config:
        schema_extra = base_schema_extra


class Model2(BaseModel):
    field1: str = Field(default=...)
    field2: int = Field(default=...)
    field3: List[int] = Field(default=...)
    field4: float = Field(default=...)
    field5: bool = Field(default=...)

    class Config:
        schema_extra = dict(**base_schema_extra, **{'field5': True})

您也可以使用以下方式继承类:

class Model3(Model2):
    field6: bool = Field(default=...)

    class Config(Model.Config):
        schema_extra = dict(**Model.Config.schema_extra, **{'field6': False})

1
谢谢,这正是我正在做的。我仍然觉得应该有更好的方法来完成这个任务。 - GZZ
你看到我的第三个建议了吗?(Model3) @GZZ --> 不幸的是,在创建继承多个模型的 pydantic 模型时,这似乎是一个挑战。可能与菱形继承冲突有关。 - Yaakov Bressler

0

声明另一个继承自基础 Model 类的类。添加另一个字段。 Config 将保持不变,但会多出一个示例字段。

class ChildModel(Model):
    field5: str = Field(default=...)
    class Config:
        schema_extra = {
            "example": {
                'field1': 'example 1',
                'field2': 1,
                'field3': [1, 2],
                'field4': 1.3,
                'field5': 'foo'
            }
        }

它会正常工作,没有问题


谢谢您的回答,不过这正是我在帖子中所指的。您必须重新定义所有字段的示例。 - GZZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,