使用Pydantic v2将int转为string:字段验证器失效问题求助
解决Pydantic v2中字段类型统一转换为字符串的问题
你的代码里验证器不生效的核心问题有两个:
- 两个字段的验证器函数重名了,第二个
transform_system_id_to_str会覆盖第一个,导致id字段的验证器完全没起作用 - 代码存在缩进错误,装饰器和函数的缩进没有和类内其他成员对齐
方案一:分开定义不同名称的验证器
修正后的代码如下:
from pydantic import BaseModel, field_validator class User(BaseModel): system_id: str db_id: str id: str record: dict isValid: bool @field_validator("id", mode='before') def transform_id_to_str(cls, value) -> str: return str(value) @field_validator("system_id", mode='before') def transform_system_id_to_str(cls, value: str | int) -> str: if isinstance(value, str): return value return str(value)
方案二:单个验证器处理多个字段(更简洁)
如果两个字段的转换逻辑一致,可以用一个验证器同时处理id和system_id,避免重复代码:
from pydantic import BaseModel, field_validator class User(BaseModel): system_id: str db_id: str id: str record: dict isValid: bool @field_validator("id", "system_id", mode='before') def transform_to_str(cls, value) -> str: return str(value)
测试验证
用以下代码测试转换效果:
# 传入int类型的字段数据 user_data = { "system_id": 123, "db_id": "db_456", "id": 789, "record": {"name": "test"}, "isValid": True } user = User(**user_data) print(user.system_id, type(user.system_id)) # 输出: 123 <class 'str'> print(user.id, type(user.id)) # 输出: 789 <class 'str'>
内容的提问来源于stack exchange,提问作者aero8991
相关产品推荐
相关产品推荐

