如何在python pydantic基础模型中要求预定义的字符串值



pydantic中是否有任何内置方式来指定选项?例如,假设我想要一个字符串值,它必须具有值"foo"或"bar"。

我知道我可以使用regex验证来做到这一点,但由于我在FastAPI中使用pydantic,用户只会将所需的输入视为字符串,但当他们输入某些内容时,会出现验证错误。pydantic的所有内置验证都显示在api界面中,所以如果有类似的东西,那就太好了

class Input(BaseModel):
option: "foo" || "bar"

是的,您可以使用枚举:

class Choices(Enum):
foo = 'foo'
bar = 'bar'
class Input(BaseModel):
option: Choices

参见此处

或者您可以使用Literal:

class Input(BaseModel):
option: Literal['foo', 'bar']

参见此处

想在此处添加另一个选项。你也可以使用Regex。对我来说效果更好,因为Literal直到python 3.8才可用(不幸的是,这对我来说不是一个容易的升级(,而且由于我只希望每个字符串都有一个字符串,enum真的不适合。

class YourClass(pydantic.BaseModel):
your_attribute: pydantic.constr(regex="^yourvalwith.escapes/abcd$")

最简单:使用typing.Literal

当您可以硬编码您的值时,Literal是一个不错的选择:

class Input(BaseModel):
option: Litera["foo", "bar"]

如果你的字符串列表是动态的,它将失败:

allowed_values = ["foo", "bar"]
class Input(BaseModel):
option: Literal[allowed_values]

Alt:使用验证器

假设无法将代码转换为regex(假设您有对象,而不仅仅是字符串(,那么您将希望使用字段验证器:

allowed_values = ["foo", "bar"]
class Input(BaseModel):
option: str
@field_validator("option")
def validate_option(cls, v):
assert v in allowed_values
return v

最佳:带注释验证器的可重用字段

假设这个字段(和验证器(将在您的代码库中被重用。更好的方法是创建一个";自定义字段类型";带有注释的验证器,例如:

from typing import Annotated
from pydantic import BaseModel, AfterValidator

allowed_values = ["foo", "bar"]
def option_in_allowed_values(v):
"""Ensures option is allowed"""
assert v in allowed_values
return v
custom_option = Annotated[str, AfterValidator(option_in_allowed_values)]

class Input(BaseModel):
option: custom_option

最新更新