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