Pydantic子Schema整数字段传空值问题及解决方案咨询
Pydantic子Schema整数字段传空值/缺省的异常解决方法
问题场景
现有如下Pydantic Schema定义:
from typing import Optional, List, Literal from pydantic import BaseModel class LocationRequest(BaseModel): business_unit: Optional[str] = None opening: Optional[int] max_applicant: Optional[int] diversity_male: Optional[int] diversity_female: Optional[int] class JobRoleRequest(BaseModel): name: str description: Optional[str] = None work_mode: Literal["full time", "half day"] class JobRoleCreateRequest(JobRoleRequest): location: List[LocationRequest]
遇到的问题:
- 给
LocationRequest的整数字段(如opening、max_applicant)传递空值时触发异常,但字符串字段business_unit留空(传""或不传递)却能正常工作; - 请求中不包含
max_applicant这类可选整数字段时也会报错。
示例请求(注:原示例中work_mode值为"Remote",与Schema定义的Literal范围不符,实际请求需使用"full time"或"half day"):
{ "name": "Job role", "description": "job role description", "work_mode": "Remote", "location": [ { "business_unit": "busiess_unit of company 1", "opening": 10, "max_applicant": 4, "diversity_male": 2, "diversity_female": 2 } ] }
原因分析
- 可选字段未设置默认值:
Optional[int]仅表示字段值可以是int或None,但如果没有显式设置= None作为默认值,Pydantic会认为该字段是必填的——即使是Optional类型,缺少字段时仍会触发验证错误。而字符串字段business_unit设置了= None,所以不传递时会自动填充默认值,不会报错。 - 空字符串无法自动转换为int类型:如果请求中给整数字段传递空字符串
"",Pydantic无法将其解析为int或None,直接抛出类型不匹配的异常;而字符串字段本身允许空字符串(或自动转为None),所以不会报错。
解决方案
方案1:给所有可选整数字段设置默认值None
修改LocationRequest的定义,为每个Optional[int]字段添加= None,这样请求中不包含该字段时,会自动填充为None,不会触发缺失字段的错误:
class LocationRequest(BaseModel): business_unit: Optional[str] = None opening: Optional[int] = None max_applicant: Optional[int] = None diversity_male: Optional[int] = None diversity_female: Optional[int] = None
方案2:支持传递空字符串作为空值(按需使用)
如果需要允许前端传递空字符串""作为整数字段的空值,可以使用Pydantic的验证器将空字符串转换为None,再进行int类型验证:
from pydantic import BeforeValidator from typing import Any def empty_str_to_none(v: Any) -> Any: return None if v == "" else v class LocationRequest(BaseModel): business_unit: Optional[str] = None opening: Optional[int] = BeforeValidator(empty_str_to_none) | None max_applicant: Optional[int] = BeforeValidator(empty_str_to_none) | None diversity_male: Optional[int] = BeforeValidator(empty_str_to_none) | None diversity_female: Optional[int] = BeforeValidator(empty_str_to_none) | None
方案3:请求中明确传递null值
在JSON请求中,直接使用null作为整数字段的空值,Pydantic会自动将其解析为Python的None,符合Optional[int]的类型要求:
{ "name": "Job role", "description": "job role description", "work_mode": "full time", "location": [ { "business_unit": "company 1 business unit", "opening": null, "max_applicant": null, "diversity_male": 2, "diversity_female": 2 } ] }
内容的提问来源于stack exchange,提问作者tariqjamal1544
相关产品推荐
相关产品推荐

