Code: Select all
from datetime import date
from pydantic import BaseModel
class CustomDate(date):
# Override POTENTIAL_FORMATS and fill it with date format strings to match your data
POTENTIAL_FORMATS = []
@classmethod
def __get_validators__(cls):
yield cls.validate_date
@classmethod
def validate_date(cls, field_value, values, field, config) -> date:
if type(field_value) is date:
return field_value
return to_date(field.name, field_value, cls.POTENTIAL_FORMATS, return_str=False)
class ExampleModel(BaseModel):
class MyDate(CustomDate):
POTENTIAL_FORMATS = ['%Y-%m-%d', '%Y/%m/%d']
dt: MyDate
Code: Select all
data
Code: Select all
info.field_name
*** AttributeError: No attribute named 'field_name'
Code: Select all
from datetime import date
from typing import Annotated
from pydantic import BaseModel, BeforeValidator
from pydantic_core import core_schema
class CustomDate:
POTENTIAL_FORMATS = []
@classmethod
def validate(cls, field_value, info):
if type(field_value) is date:
return field_value
return to_date(info.field_name, field_value, potential_formats, return_str=False)
@classmethod
def __get_pydantic_core_schema__(cls, source, handler) -> core_schema.CoreSchema:
return core_schema.general_plain_validator_function(cls.validate)
def custom_date(potential_formats):
"""
:param potential_formats: A list of datetime format strings
"""
def validate_date(field_value, info) -> date:
if type(field_value) is date:
return field_value
return to_date(info.field_name, field_value, potential_formats, return_str=False)
CustomDate = Annotated[date, BeforeValidator(validate_date)]
return CustomDate
class ExampleModel(BaseModel):
class MyDate(CustomDate):
POTENTIAL_FORMATS = ['%Y-%m-%d', '%Y/%m/%d']
dt: MyDate
dt2: custom_date(['%Y-%m-%d', '%Y/%m/%d'])