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

如何在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

关键说明

  1. 类型兼容:把value的类型改为Union[str, int, List[str]],适配不同字段需要的类型
  2. 条件校验:通过field_validator针对value字段做校验,根据name字段的值分支处理不同规则
  3. 明确报错:每种校验失败时都会抛出带有具体提示的错误信息,方便排查问题

测试示例

合法请求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:50:15