FastAPI:如何在Pydantic的BaseModel中指定字段的可能取值?

7

我有一个如下的模型:

# 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']

感谢您的帮助 :)


1
这个回答解决了你的问题吗?如何在Python Pydantic BaseModel中要求预定义的字符串值? - Drdilyor
我没有尝试过,但似乎是一个不错的解决方案。谢谢! - PicxyB
3个回答

16

使用 Literalhttps://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']

9
你可以使用 枚举 来自 Python标准库
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的typing中的OptionalUnion结合使用,以使此字段变为可选或允许其他类型(从传递给Union的所有类型中选择第一个匹配类型将由Pydantic使用,因此您可以使用Union[CEnum,str]创建“捕获所有”场景)。


谢谢您的回答 :) 我找到了另一个解决方案,使用pydantic.validator(和一个唯一的模型),如果您想要检查的话。 - PicxyB
这非常灵活。 - MSS
这个可以工作,但反序列化后你会得到一个枚举类型。如果你需要在反序列化后得到字符串类型,那么 Literal 更加适合,就像这里回答的一样 https://dev59.com/88Dqa4cB1Zd3GeqPoOva#74113892。 - Miroslav Valcicak
ConfigDict有一个标志use_enum_values = True适用于此情况https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.use_enum_values - Louis Maddox

4

我找到了一个解决方案,

我使用了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/,该链接提供了有关使用Pydantic验证器的信息。


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