Оптимизация запроса (SQLalchemy) и вывод в json

Сейчас у меня есть такой метод:

async def find_all(cls, session: AsyncSession, filters: PyBaseModel | None):

    query = select(cls.model).filter_by(**filter_dict)
    result = await session.execute(query)
    records = result.scalars().all()

    dict_records = [{column.key: getattr(record, column.key) for column in record.__table__.columns} for record in records]

    return dict_records

Используя схему Pydantic для валидации фильтров, я делаю запрос к модели ORM, на выходе хочу получить список словарей (каждая запись - словарь). Всё работает, но мне кажется эта конструкция тяжелой. Вроде метод универсальный и подходит для разных моделей, но по сути, кроме самого запроса, там ещё происходит преобразование модели ORM в словарь, и делается это что называется "в лоб".

Вопрос: Есть какой-то более лаконичный вариант получить тот же результат, но с меньшими потерями памяти и скорости?

P.S. Словарик получаю для своего API, может это как-то поможет. Вдруг есть прямой метод для конвертации ORM модели в json?


Ответы (1 шт):

Автор решения: Irking

Решил для себя так: На уровне API никаких преобразований не происходит, там голые маршруты. Внутри логики запроса тоже никаких преобразований - только сам запрос с необходимыми параметрами и возврат результата.

Для преобразования получаемых данных добавил в базовую модель ORM медоты:

def to_dict(self) -> Dict[str, Any]:
    return {c.name: getattr(self, c.name) for c in self.__table__.columns}

def __repr__(self) -> str:
    return f"<{self.__class__.__name__}(id={self.id})>"

Пока мне этого хватает. Ещё, как вариант, можно сделать отдельный модуль для работы с данными и там прописать какую-то логику обработки / трансформации, в общем, инкапсулировать этот процесс от других частей приложения.

→ Ссылка