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

Pydantic模型接收None作为int值报错的解决方法咨询

如何让Pydantic模型字段同时支持整数和None值?

我定义了一个包含source_site_id字段的LatLongModel模型,需要该字段同时支持整数类型与None值。尝试了source_site_id: Optional[int] = None、source_site_id: int = None以及source_site_id: Optional[int]这几种写法,但传入None值时仍收到错误:value is not a valid integer (type=type_error.integer)。

模型代码如下:

class LatLongModel(BaseModel):
    # id: str
    object_id: Optional[int] = None
    primo_id: Optional[int] = None
    name: Optional[str] = None
    entity_type: Optional[str] = None
    division_id: Optional[int] = None
    division: Optional[str] = None
    status: Optional[str] = None
    longitude: Optional[float] = None
    latitude: Optional[float] = None
    site_id: Optional[int] = None
    source_site_id: Optional[int] = None
    site_type: Optional[str] = None

解决方案

1. 显式配置allow_none=True

在Pydantic中,虽然Optional[int]理论上已包含None的可能性,但部分场景下需要通过Field显式声明允许None值,确保类型校验器正确识别规则:

from pydantic import BaseModel, Field
from typing import Optional

class LatLongModel(BaseModel):
    # 其他字段保持不变
    source_site_id: Optional[int] = Field(None, allow_none=True)

2. 检查传入数据的实际类型

报错的常见原因是传入的并非真正的Python None值,而是字符串"null"、空字符串或其他非整数类型:

  • 若从JSON解析数据,确保JSON中的null被正确转为Python的None(Pydantic默认会处理,但手动构造数据时需注意)
  • 若从表单/查询参数传入,字符串"null"不会自动转为None,需要在接收环节额外做类型转换

3. 确认Pydantic版本与导入正确性

  • 若使用Pydantic v1,确保Optional从typing导入;v2版本可从typing或typing_extensions导入,两者均兼容
  • 旧版本Pydantic对Optional的处理可能存在边缘问题,升级到最新稳定版可解决这类兼容性问题

4. 显式使用Union类型(替代Optional)

Optional[int]是Union[int, None]的别名,显式使用Union有时能解决隐式类型推断的异常:

from typing import Union
from pydantic import BaseModel

class LatLongModel(BaseModel):
    # 其他字段保持不变
    source_site_id: Union[int, None] = None

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:24:04