Pydantic 在 FastAPI 中模拟良好实践

GZZ*_*GZZ 4 python pydantic fastapi

我正在使用 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,
            }
        }
Run Code Online (Sandbox Code Playgroud)

然而,我发现我的代码中有相当多的重复,例如,如果我想创建另一个继承自添加Model另一个字段的类field5,我需要重新编写该类Config才能定义新示例。

有没有好的方法可以做到这一点?例如,是否有任何工具允许您定义具有所有属性和示例的字段,然后Model根据需要包含的内容的定义创建类?

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

Yaa*_*ler 5

您可以创建一个额外的基本架构并在每个实例化中进行修改:

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})
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下方法继承类:

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

    class Config(Model.Config):
        schema_extra = dict(**Model.Config.schema_extra, **{'field6': False})
Run Code Online (Sandbox Code Playgroud)