You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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())  # 正常输出

关键说明

  1. 字段调整:将emails和mobile_numbers设为可选类型,满足未开启告警时可填可不填的需求。
  2. 验证器规范:使用(cls, value, values)签名,通过values字典获取其他字段值,避免签名错误。
  3. 鲁棒性处理:统一将开关状态转为小写,避免大小写输入差异;同时处理空字符串、"None"等无效输入场景。

内容的提问来源于stack exchange,提问作者Shubhangi Aher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:57:28