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

