如何在FastAPI的Pydantic模型中基于特定枚举成员实现验证
当然可以实现这些验证规则,利用Pydantic的字段验证器就能根据name字段的不同,对value应用对应的校验逻辑。下面是改造后的完整代码:
改造后的Pydantic模型
from enum import Enum from typing import Union, List from pydantic import BaseModel, field_validator, ValidationError import re class ProfileField(str, Enum): mobile = "mobile" email = "email" address = "address" interests = "interests" # 需要字符串列表 class ProfileType(str, Enum): primary = "primary" secondary = "secondary" class ProfileDetail(BaseModel): name: ProfileField value: Union[str, int, List[str]] type: ProfileType @field_validator('value') def validate_value_based_on_name(cls, v, values): name = values.data.get('name') if not name: return v # 邮箱格式校验 if name == ProfileField.email: if not isinstance(v, str): raise ValueError(f"{name}的值必须是字符串类型") email_pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$' if not re.match(email_pattern, v): raise ValueError(f"{name}格式不正确") # 手机号类型+格式校验 elif name == ProfileField.mobile: if not isinstance(v, int): raise ValueError(f"{name}的值必须是整数类型") mobile_str = str(v) # 示例为国内11位手机号正则,可根据需求调整 mobile_pattern = r'^\d{11}$' if not re.match(mobile_pattern, mobile_str): raise ValueError(f"{name}格式不正确,需为11位数字") # 地址长度校验 elif name == ProfileField.address: if not isinstance(v, str): raise ValueError(f"{name}的值必须是字符串类型") if len(v) > 50: raise ValueError(f"{name}长度不能超过50个字符") # 兴趣爱好类型校验 elif name == ProfileField.interests: if not isinstance(v, list) or not all(isinstance(item, str) for item in v): raise ValueError(f"{name}必须是字符串列表") return v
关键说明
- 类型兼容:把
value的类型改为Union[str, int, List[str]],适配不同字段需要的类型 - 条件校验:通过
field_validator针对value字段做校验,根据name字段的值分支处理不同规则 - 明确报错:每种校验失败时都会抛出带有具体提示的错误信息,方便排查问题
测试示例
合法请求JSON
{ "data": [ { "name": "email", "value": "abcd@gmail.com", "type": "primary" }, { "name": "mobile", "value": 13800138000, "type": "secondary" }, { "name": "address", "value": "北京市朝阳区某某街道", "type": "primary" }, { "name": "interests", "value": ["读书", "跑步"], "type": "secondary" } ] }
非法请求示例(邮箱格式错误)
{ "data": [ { "name": "email", "value": "abcdgmail.com", "type": "primary" } ] }
此时会触发ValidationError,提示email格式不正确。
内容的提问来源于stack exchange,提问作者putta
相关产品推荐
相关产品推荐

