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

Pydantic中Optional字段设长度约束后空值提交报错如何解决

问题原因

报错核心来自两个配置缺失和认知偏差:

  • Optional[类型]在Pydantic中仅表示该字段允许接收None作为合法值,不会自动将字段设为非必填,也不会自动赋值默认值None。你当前的写法没有指定默认值,空值场景不会自动跳过校验。
  • 表单未填写时,前端通常会传递空字符串""而非None,经过strip_whitespace=True处理后仍为长度0的空串,不属于None范畴,因此会正常触发min_length=8的校验规则,抛出长度不足的错误。
解决方案

根据需要兼容的场景二选一即可:

方案1:仅未传字段时跳过校验,传值(含空串)即触发校验

显式给字段设置默认值None即可,这是最简洁的写法:

from typing import Optional
from pydantic import BaseModel, constr

class PostCreateSchema(BaseModel):
    contact_phone: Optional[constr(strip_whitespace=True, min_length=8, max_length=10)] = None

该配置的规则:

  • 完全不传contact_phone字段、或传值为None时,校验通过,不会触发长度规则
  • 传任意非None的字符串值(包括空串)时,会自动去除首尾空白,校验长度是否在8-10位区间
    注意:该配置下传入空字符串会被判定为已传值,触发长度不足报错

方案2:空串/全空白串也视为未填写,不触发校验

如果需要兼容表单传空串、全空格字符串的场景(即用户填了又全删、只输入空格的情况也算未填写),可以增加前置校验器将空内容统一转为None:

from typing import Optional
from pydantic import BaseModel, constr, validator

class PostCreateSchema(BaseModel):
    contact_phone: Optional[constr(strip_whitespace=True, min_length=8, max_length=10)] = None

    @validator("contact_phone", pre=True)
    def convert_empty_str_to_none(cls, value):
        if isinstance(value, str) and value.strip() == "":
            return None
        return value

该配置的规则:

  • 不传字段、传None、传空串、传全空格字符串时,都会被处理为None,直接通过校验
  • 传实际包含有效内容的字符串时,自动去除首尾空白后校验长度是否符合8-10位的要求,仅当有有效输入时才触发校验规则,完全匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:12:24