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

FastAPI中Pydantic邮箱验证遇@field_validator报错,@validator已弃用

解决Pydantic @field_validator 实例方法报错问题

你遇到的错误是因为Pydantic v2的@field_validator装饰器不能用于带self的实例方法,必须将验证方法定义为类方法或静态方法。

方法一:使用@classmethod修改验证方法

把验证方法改成类方法,用cls代替self作为第一个参数:

from pydantic import BaseModel, Field, field_validator
from pydantic_core import EmailNotValidError
from pydantic.validators import validate_email

class CheckLoginRequest(BaseModel):
    user_email: str = Field(min_length=5, default="username")
    user_number: str = Field(min_length=5, default="+923323789263")

    @field_validator("user_email")
    @classmethod
    def validate_email(cls, value):
        try:
            validate_email(value)
        except EmailNotValidError:
            raise ValueError("Invalid email format")
        return value

方法二:使用@staticmethod修改验证方法

如果不需要访问类相关属性,也可以用静态方法,不需要第一个参数:

from pydantic import BaseModel, Field, field_validator
from pydantic_core import EmailNotValidError
from pydantic.validators import validate_email

class CheckLoginRequest(BaseModel):
    user_email: str = Field(min_length=5, default="username")
    user_number: str = Field(min_length=5, default="+923323789263")

    @field_validator("user_email")
    @staticmethod
    def validate_email(value):
        try:
            validate_email(value)
        except EmailNotValidError:
            raise ValueError("Invalid email format")
        return value

额外优化:直接使用Pydantic的EmailStr类型

其实Pydantic已经内置了邮箱类型验证,你可以直接用EmailStr代替str,省去自定义验证方法的麻烦:

from pydantic import BaseModel, Field
from pydantic import EmailStr

class CheckLoginRequest(BaseModel):
    user_email: EmailStr = Field(default="username@example.com")
    user_number: str = Field(min_length=5, default="+923323789263")

这样当邮箱格式不合法时,Pydantic会自动抛出标准的验证错误。

内容的提问来源于stack exchange,提问作者rameez khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:32:12