如何使用 FastAPI 在 Pydantic 字段中设置范围和超出范围的值?

Sim*_*Zen 7 python range pydantic fastapi

所以我有以下代码行:

item: Optional[int] = Field(None, ge=1, le=168)
Run Code Online (Sandbox Code Playgroud)

我也希望有可能设定-1价值。因此,我需要排除零值,但我想允许一个值和来自to-1的值。1168

有什么办法可以做到这一点吗?

Chr*_*ris 9

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

更新

请注意,在 Pydantic V2 中,@validator已被弃用并被@field_validator. 请查看此答案以获取更多详细信息和示例。