FASTAPI & Pydantic:如何为 pydantic.Basemodel 中的字段指定可能的值

时间:2021-06-02 13:26:57

标签: fastapi pydantic

我有一个模型:

# Imports
from pydantic import BaseModel

# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: str

@app.post('/endpoint_to_post')
async def post_log(my_model: MyModel):

我想对这个模型指定一些约束。 实际上,我需要对模型 MyModel 的字段 C 进行可能值 约束。

喜欢:

# Imports
from pydantic import BaseModel

# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: str in ['possible_value_1', 'possible_value_2']

感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

您可以使用 enum 中的 Python stdlib

from enum import Enum
from pydantic import BaseModel


class CEnum(Enum):
    VALUE_1 = 'possible_value_1'
    VALUE_2 = 'possible_value_2'


# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: CEnum

Pydantic 会自动将与枚举值匹配的任何字符串转换为正确的枚举实例,如果它不匹配任何内容,则会引发 ValidationError。您可以将其与 Python 的 Optional 中的 Uniontyping 结合使用,以使该字段成为可选字段或也允许其他类型(所有类型中的第一个匹配类型传递给 {{1} } 将被 Pydantic 使用,因此您可以使用 Union 创建一个“包罗万象”的场景。

答案 1 :(得分:1)

我找到了解决方案,

我使用 pydantic.validator 来实现这一点。

示例:

# Imports
from pydantic import BaseModel, validator

# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: str # in ['possible_value_1', 'possible_value_2']

    @validator('c')
    def c_match(cls, v):
        if not v in ['possible_value_1', 'possible_value_2']:
            raise ValueError('c must be in [possible_value_1, possible_value_2]')
        return v

参见https://pydantic-docs.helpmanual.io/usage/validators/