所以我有以下代码行:
item: Optional[int] = Field(None, ge=1, le=168)
并且我也希望能够设置
-1
值。因此,我需要 排除零 值,但我想允许 -1
值以及从 1
到 168
的值。
有什么办法可以做到这一点吗?
您可以指定从
-1
到 168
的范围,并且还可以使用自定义 Pydantic 验证器来检查该值是否等于 0
。如果是这样, raise ValueError
。如果使用 Pydantic 模型来定义端点的查询参数(使用 Depends()
),请查看这个答案。
from fastapi import FastAPI
from typing import Optional
from pydantic import Field, BaseModel, validator
app = FastAPI()
class Foo(BaseModel):
item: Optional[int] = Field(None, ge=-1, le=168)
@validator('item')
def prevent_zero(cls, v):
if v == 0:
raise ValueError('ensure this value is not 0')
return v
@app.post("/")
def submit(foo: Foo):
return foo
请注意,在 Pydantic V2 中,
@validator
已被弃用,并被 @field_validator
取代。请查看此答案以获取更多详细信息和示例。
我一直在尝试定义“-1 或 > 0”,并且我对此非常非常接近:
from typing import Union, Literal
from pydantic import PositiveInt
from pydantic.fields import Field
from pydantic_settings import BaseSettings
class MyClass(BaseSettings):
item: Union[Literal[-1], PositiveInt] = Field(union_mode=“left_to_right”, default=-1)
我相信类型定义本身就可以按预期工作(需要做更多测试),但环境变量方面的 pydantic_settings 却不能。问题在于,这是使用 pydantic 设置并从环境变量应用它,在与此处的类型定义匹配时,环境变量始终是“字符串”类型。所以从技术上讲,这是失败的。
否则,这似乎在没有自定义验证器的情况下表达了我想要的内容......