How to validate model field with pydantic?

63 Views Asked by At

I need to validate a "contact number" field of ContactModel but can't find a proper validator.

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')

Get the following error:

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

Moreover @validator and @root_validator seem to be deprecated.

1

There are 1 best solutions below

2
Silent Wraith On

both @validator and @root_validator are deprecated

You should use @field_validator: latest validation

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