Pydantic V2中@field_validator未执行问题求助
问题分析与解决
问题出在Pydantic V2的内置类型转换逻辑优先级高于你定义的mode='before'验证器:当字段类型声明为Optional[float]时,Pydantic会先尝试将输入的空字符串转换为float,转换失败直接抛出float_parsing错误,导致你的验证器根本没机会执行。
解决方法一:使用Annotated结合BeforeValidator
这是最简洁的方案,通过BeforeValidator强制在Pydantic内置类型转换前执行自定义处理逻辑:
from typing import Optional, Annotated from pydantic import BaseModel, BeforeValidator def process_numeric_field(value): # 空字符串转None if value == '': return None # 尝试转换为float,失败则抛出自定义错误 try: return float(value) except ValueError: raise ValueError("Unable to parse string as a number. Please provide a valid number.") class PydanticProduct(BaseModel): fid: Annotated[Optional[float], BeforeValidator(process_numeric_field)] water: Annotated[Optional[float], BeforeValidator(process_numeric_field)] class ConfigDict: from_attributes = True
解决方法二:调整字段类型兼容输入
先让字段接受字符串类型输入,确保mode='before'验证器能被触发,再处理转换:
from typing import Optional, Union from pydantic import BaseModel, field_validator class PydanticProduct(BaseModel): # 允许字符串、float或None作为输入 fid: Optional[Union[str, float]] water: Optional[Union[str, float]] class ConfigDict: from_attributes = True @field_validator('fid', 'water', mode='before') def check_empty_fields(cls, value) -> Optional[float]: if value == '': return None try: return float(value) except ValueError: raise ValueError("Unable to parse string as a number. Please provide a valid number.")
两种方案都能实现:空字符串转None、有效字符串转float、无效字符串抛出自定义错误的需求。
内容的提问来源于stack exchange,提问作者yeaaaahhhh..hamf hamf
相关产品推荐
相关产品推荐

