FastAPI:如何为 Pydantic 的 Basemodel 中的字段指定可能的值?

Pic*_*xyB 9 python pydantic fastapi

我有一个像这样的模型:

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

我想对该模型指定一些约束。事实上,我需要对模型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']
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助 :)

Ome*_*aim 20

使用Literal https://peps.python.org/pep-0586/

from pydantic import BaseModel
from typing import Literal

# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: Literal['possible_value_1', 'possible_value_2']
Run Code Online (Sandbox Code Playgroud)


Gwy*_*idD 10

您可以使用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
Run Code Online (Sandbox Code Playgroud)

Pydantic 会自动将与枚举值匹配的任何字符串转换为正确的枚举实例,ValidationError如果不匹配任何内容,则会引发异常。您可以将它与Python 相结合,使该字段Optional成为可选字段,或者也允许其他类型(传递给的所有类型中的第一个匹配类型将由 Pydantic 使用,因此您可以使用 创建一个“catch-all”场景) 。UniontypingUnionUnion[CEnum, str]


Pic*_*xyB 5

我找到了一个解决方案,

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

cf https://pydantic-docs.helpmanual.io/usage/validators/