You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pydantic V2中根据值类型条件应用字段约束?

解决Pydantic模型仅对特定类型字段应用约束的问题

你遇到的问题是因为直接在Field中添加ge=2约束,会对所有类型的bar值触发检查,而非int类型无法支持数值比较,导致报错。以下两种方法可以实现仅对int类型应用约束:

方法一:自定义前置验证函数

通过BeforeValidator编写自定义逻辑,仅在值为int类型时执行约束检查:

from pydantic import BaseModel, Field, BeforeValidator
from typing import Annotated, Union

def check_int_min(v):
    # 仅对int类型值应用ge=2约束
    if isinstance(v, int) and v < 2:
        raise ValueError("当bar为整数时,值必须≥2")
    return v

class Foo(BaseModel):
    bar: Annotated[Union[str, list, int], BeforeValidator(check_int_min)] = Field('some string')

测试效果:

Foo(bar='asdf')  # 正常实例化,无约束检查
Foo(bar=4)       # 正常实例化
Foo(bar=1)       # 触发报错:ValueError: 当bar为整数时,值必须≥2

方法二:为Union分支单独指定约束

利用Pydantic对Union类型的匹配机制,仅给int类型分支添加约束:

from pydantic import BaseModel, Field
from typing import Union, Annotated

class Foo(BaseModel):
    bar: Union[str, list, Annotated[int, Field(ge=2)]] = Field('some string')

测试效果:

Foo(bar='asdf')  # 正常实例化
Foo(bar=4)       # 正常实例化
Foo(bar=1)       # 触发报错:Input should be greater than or equal to 2

两种方法对比:

  • 方法一灵活性更高,可扩展复杂的多类型验证逻辑;
  • 方法二更简洁,直接利用Pydantic原生的类型约束机制。

内容的提问来源于stack exchange,提问作者A-Abe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:04:58