Search code examples
pythonpython-3.xpydantic

How to change date format in pydantic


How to change date format in pydantic for validation and serialization? For validation I am using @validator. Is there an solution for both cases?


Solution

  • As of pydantic 2.0, we can use the @field_serializer decorator for serialization, and @field_validator for validation.

    Taken from pydantic docs:

    from datetime import datetime, timezone
    
    from pydantic import BaseModel, field_serializer
    
    
    class WithCustomEncoders(BaseModel):
    
        dt: datetime
    
        @field_serializer('dt')
        def serialize_dt(self, dt: datetime, _info):
            return dt.timestamp()
    
    
    m = WithCustomEncoders(
        dt=datetime(2032, 6, 1, tzinfo=timezone.utc)
    )
    print(m.model_dump_json())
    #> {"dt":1969660800.0}
    

    And for validation:

    from pydantic_core.core_schema import FieldValidationInfo
    
    from pydantic import BaseModel, ValidationError, field_validator
    
    
    class UserModel(BaseModel):
        name: str
        username: str
        password1: str
        password2: str
    
        @field_validator('name')
        def name_must_contain_space(cls, v):
            if ' ' not in v:
                raise ValueError('must contain a space')
            return v.title()
    
        @field_validator('password2')
        def passwords_match(cls, v, info: FieldValidationInfo):
            if 'password1' in info.data and v != info.data['password1']:
                raise ValueError('passwords do not match')
            return v
    
        @field_validator('username')
        def username_alphanumeric(cls, v):
            assert v.isalnum(), 'must be alphanumeric'
            return v
    
    
    user = UserModel(
        name='samuel colvin',
        username='scolvin',
        password1='zxcvbn',
        password2='zxcvbn',
    )
    print(user)
    """
    name='Samuel Colvin' username='scolvin' password1='zxcvbn' password2='zxcvbn'
    """