from typing import Self from pydantic import BaseModel from pydantic.alias_generators import to_camel class CustomConfig: populate_by_name = True from_attributes = True class BaseSchema(BaseModel): class Config: from_attributes = True alias_generator = to_camel populate_by_name = True @classmethod def from_sql_model(cls, model, fields: dict): model_dict = {c.name: getattr(model, c.name) for c in model.__table__.columns} model_dict.update(fields) return cls(**model_dict) def model_dump_parent(self): parent_class: BaseModel = self.__class__.__bases__[0] parent_fields = set(parent_class.model_fields.keys()) return self.model_dump(include=parent_fields) @classmethod def from_orm_list(cls, sql_models) -> list[Self]: return [cls.model_validate(model) for model in sql_models] class CustomModelSnake(BaseModel): class Config: from_attributes = True class OkMessageSchema(BaseSchema): ok: bool message: str class PaginationSchema(BaseSchema): page: int | None = None items_per_page: int | None = None class PaginationInfoSchema(BaseSchema): total_pages: int = 0 total_items: int = 0 class BaseEnumSchema(BaseSchema): id: int name: str class BaseEnumListSchema(BaseSchema): items: list[BaseEnumSchema]