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

如何在Pydantic 2.0中定义带约束的可选字符串字段?

Pydantic 2.0 可选字符串字段的约束验证方案

问题根源

你遇到的string_too_short错误,是因为输入了**空字符串("")**而非None。Pydantic会将空字符串视为有效的str类型值,从而触发min_length约束校验;而你的需求中"未提供时允许为None",指的是字段不存在或值为None,并非传入空字符串。

可行实现方案

方案1:基础实现(区分空字符串与None)

如果需要严格区分"未提供/None"和"空字符串",直接使用Annotated结合Field即可,这是符合你需求的标准写法:

from typing import Annotated
from pydantic import BaseModel, Field

class RoleModel(BaseModel):
    role_desc: Annotated[str | None, Field(
        min_length=5,
        max_length=200,
        examples=["Role description is provided here"],
        default=None,
    )]
  • 当字段未传入或传入None时,自动使用默认值None,不会触发约束校验
  • 当传入非None的字符串时,会严格校验长度规则,空字符串会被拦截(符合逻辑,因为空字符串是主动传入的有效值)

方案2:自动将空字符串转为None

如果需要把空字符串等同于"未提供"处理,可以通过BeforeValidator添加转换逻辑:

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

def empty_str_to_none(value: str | None) -> str | None:
    return None if value == "" else value

class RoleModel(BaseModel):
    role_desc: Annotated[str | None, BeforeValidator(empty_str_to_none), Field(
        min_length=5,
        max_length=200,
        examples=["Role description is provided here"],
        default=None,
    )]
  • 传入None或未传字段:值为None,不触发校验
  • 传入空字符串:自动转为None,跳过校验
  • 传入非空字符串:正常执行长度约束校验

原代码说明

你给出的三种实现方式本身是正确的,错误触发的核心原因是输入了空字符串而非None。str | None类型允许的是None或符合约束的字符串,空字符串属于字符串范畴,因此会被校验长度规则。

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:03:25