How to change date format in pydantic for validation and serialization?
For validation I am using @validator
. Is there an solution for both cases?
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'
"""