如何让Pydantic解析时将数值字段的空字符串转为0?
解决方案
方法1:使用BeforeValidator自定义字段转换逻辑
直接给需要处理的数值字段添加前置验证器,将空字符串转为0:
from pydantic import BaseModel, BeforeValidator, Field from typing import Annotated def empty_str_to_zero(v): if v == "": return 0 return v class A(BaseModel): a: Annotated[int, BeforeValidator(empty_str_to_zero)] = Field(default=0) # 测试(假设目标文件内容为{"a": ""}) instance = A.parse_file("test.json") print(instance.dict()) # 输出: {'a': 0}
该方法针对性强,仅对指定字段生效,不影响其他字段的正常校验逻辑。
方法2:自定义可转换空字符串的数值类型
如果多个字段都需要相同的转换规则,可以自定义复用类型,避免重复编写验证逻辑:
from pydantic import BaseModel, GetCoreSchemaHandler from typing import Any, TypeVar from pydantic_core import core_schema T = TypeVar('T', int, float) def empty_str_to_default(default: T): def validator(v: Any) -> Any: if v == "": return default return v return validator class ZeroableInt(int): @classmethod def __get_pydantic_core_schema__(cls, source_type: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: return core_schema.no_info_wrap_validator_function( empty_str_to_default(0), handler(int), ) class A(BaseModel): a: ZeroableInt = 0 b: ZeroableInt = 0 # 其他需要转换的字段直接复用该类型 # 测试 instance = A.parse_file("test.json") print(instance.dict()) # 若文件中b字段为空字符串,输出: {'a': 0, 'b': 0}
这种方式适合大量字段需要相同转换规则的场景,代码更简洁易维护。
补充说明
- 以上代码基于Pydantic v2版本编写,若使用v1版本,需替换为
validator装饰器实现前置转换; - 转换逻辑仅处理存在但为空字符串的字段,字段缺失时依然会使用
Field(default=0)设置的默认值,完全匹配需求。
内容的提问来源于stack exchange,提问作者Rajarshi Bandopadhyay
相关产品推荐
相关产品推荐

