Оптимизация запроса (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 шт):
Решил для себя так: На уровне 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})>"
Пока мне этого хватает. Ещё, как вариант, можно сделать отдельный модуль для работы с данными и там прописать какую-то логику обработки / трансформации, в общем, инкапсулировать этот процесс от других частей приложения.