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
相关产品推荐
相关产品推荐

