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

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
        }
    ]
}

原因分析

  1. 可选字段未设置默认值:Optional[int]仅表示字段值可以是int或None,但如果没有显式设置= None作为默认值,Pydantic会认为该字段是必填的——即使是Optional类型,缺少字段时仍会触发验证错误。而字符串字段business_unit设置了= None,所以不传递时会自动填充默认值,不会报错。
  2. 空字符串无法自动转换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:15:14