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

问题描述 投票:0回答:2

所以我有以下代码行:

item: Optional[int] = Field(None, ge=1, le=168)

并且我也希望能够设置

-1
值。因此,我需要 排除零 值,但我想允许
-1
值以及从
1
168
的值。

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

python range fastapi pydantic
2个回答
8
投票

您可以指定从

-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
取代。请查看此答案以获取更多详细信息和示例。


0
投票

我一直在尝试定义“-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 设置并从环境变量应用它,在与此处的类型定义匹配时,环境变量始终是“字符串”类型。所以从技术上讲,这是失败的。

否则,这似乎在没有自定义验证器的情况下表达了我想要的内容......

© www.soinside.com 2019 - 2024. All rights reserved.