如何使用pydantic验证模型字段?

0 投票
1 回答
60 浏览
提问于 2025-04-13 02:58

我需要验证一个“联系号码”的字段,属于ContactModel,但找不到合适的验证器。

from datetime import date

from pydantic import BaseModel, Field, EmailStr, model_validator, field_validator, validator

import re


class ContactModel(BaseModel):
    first_name: str = Field(max_length=15)
    last_name: str = Field(max_length=15)
    email: EmailStr
    contact_number: str
    birth_date: date
    additional_information: str = Field(max_length=250)


    @validator("contact_number")
    def validate_contact_number(self, value):
        """
        123-456-7890
        (123) 456-7890
        123 456 7890
        123.456.7890
        +91 (123) 456-7890
        """
        if not re.match(r'^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$', value):
            raise ValueError('Invalid contact number')

出现了以下错误:

raise PydanticUserError(
pydantic.errors.PydanticUserError: `@validator` cannot be applied to instance methods

而且,@validator@root_validator似乎已经不再推荐使用了。

1 个回答

0

这段话的意思是,@validator@root_validator 这两个东西已经不再推荐使用了,官方已经标记为过时了。

你应该使用 @field_validator,这是最新的验证方式,可以参考这个链接了解更多:最新的验证方法

from datetime import date

from pydantic import BaseModel, Field, EmailStr, ValidationInfo, field_validator

import re


class ContactModel(BaseModel):
    first_name: str = Field(max_length=15)
    last_name: str = Field(max_length=15)
    email: EmailStr
    contact_number: str
    birth_date: date
    additional_information: str = Field(max_length=250)


    @field_validator("contact_number")
    def validate_contact_number(cls, value: str, info: ValidationInfo) -> str:
        """
        123-456-7890
        (123) 456-7890
        123 456 7890
        123.456.7890
        +91 (123) 456-7890
        """
        if not re.match(r'^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$', value):
            raise ValueError('Invalid contact number')
        return value

撰写回答