FastAPI中Pydantic模型多字段验证及Validator报错解决咨询
解决方案
错误原因解析
你遇到的错误翻译如下:
pydantic.errors.ConfigError: 验证器<function info_update.clean_space at 0x7f9316664940>的签名无效:(cls, mobile_numbers, enable_sms_alert),正确签名应为:(cls, value, values, config, field),其中"values"、"config"和"field"都是可选参数。
问题出在Pydantic验证器的函数签名不符合规范——不能直接将其他字段作为参数传入,需要通过values字典(第三个参数)来获取已验证完成的其他字段值。
修正后的完整代码
首先调整模型字段(未开启告警时手机号/邮箱可空),再编写符合规范的验证逻辑:
from pydantic import BaseModel, validator, ValidationError from typing import Optional # Python3.10以下版本需要导入 class Info(BaseModel): enable_mail_alert: str = 'n' enable_sms_alert: str = 'n' emails: Optional[str] = None # 未开启邮件告警时可空 mobile_numbers: Optional[str] = None # 未开启短信告警时可空 @validator('mobile_numbers') def validate_mobile_when_sms_enabled(cls, value, values): # 从values字典获取短信告警开关状态 enable_sms = values.get('enable_sms_alert', 'n').lower() if enable_sms == 'y': # 开启短信告警时,校验手机号是否有效 if value is None or value.strip() == '' or value.strip().lower() == 'none': raise ValueError('手机号字段为必填项') return value.strip() if value else value @validator('emails') def validate_email_when_mail_enabled(cls, value, values): # 从values字典获取邮件告警开关状态 enable_mail = values.get('enable_mail_alert', 'n').lower() if enable_mail == 'y': # 开启邮件告警时,校验邮箱是否有效 if value is None or value.strip() == '' or value.strip().lower() == 'none': raise ValueError('邮箱字段为必填项') return value.strip() if value else value # 测试用例示例 if __name__ == '__main__': # 测试开启短信告警但未填手机号 try: Info(enable_sms_alert='y') except ValidationError as e: print(e) # 输出手机号必填错误 # 测试未开启告警,手机号和邮箱可空 valid_case = Info(enable_sms_alert='n', enable_mail_alert='n') print(valid_case.dict()) # 正常输出
关键说明
- 字段调整:将
emails和mobile_numbers设为可选类型,满足未开启告警时可填可不填的需求。 - 验证器规范:使用
(cls, value, values)签名,通过values字典获取其他字段值,避免签名错误。 - 鲁棒性处理:统一将开关状态转为小写,避免大小写输入差异;同时处理空字符串、"None"等无效输入场景。
内容的提问来源于stack exchange,提问作者Shubhangi Aher
相关产品推荐
相关产品推荐

