Implement a Custom Base Model for global behavior
masterCreate a global CustomModel inheriting from BaseModel to enforce application-wide standards. Common use cases include:
- Standardizing
datetimeserialization (e.g., forcing UTC and specific string formats) using@field_serializer. - Adding utility methods like
serializable_dict()to return dictionaries containing only JSON-serializable fields usingjsonable_encoder.
from datetime import datetime
from typing import Any
from zoneinfo import ZoneInfo
from fastapi.encoders import jsonable_encoder
from pydantic import BaseModel, ConfigDict, field_serializer
class CustomModel(BaseModel):
model_config = ConfigDict(populate_by_name=True)
@field_serializer("*", when_used="json", check_fields=False)
def _serialize_datetimes(self, value: Any) -> Any:
if isinstance(value, datetime):
if value.tzinfo is None:
value = value.replace(tzinfo=ZoneInfo("UTC"))
return value.strftime("%Y-%m-%dT%H:%M:%S%z")
return value
def serializable_dict(self, **kwargs):
"""Returns a dictionary containing only serializable fields."""
default_dict = self.model_dump()
return jsonable_encoder(default_dict)