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
相关产品推荐
相关产品推荐

