Я использую структуру, которая выполняет разбиение на страницы следующим образом:
def get_count_query(self):
return self.session.query(func.count('*')).select_from(self.model)
def paginate(self):
... <irrelevant>...
count = self.get_count_query.scalar()
...
Я хочу переопределить метод get_count_query для использования моего собственного запроса, потому что я фильтрую некоторые результаты, а get_count_query просто возвращает все элементы в таблице. Запросы создаются динамически, например, один запрос может быть таким:
Asset.query.join(StatusLabel).filter(StatusLabel.status == 'Deployable', or_(
Asset.assigned_to.isnot(None)),
Asset.deleted_at.is_(None))
Я могу легко подсчитать элементы в этом запросе с помощью query.count()
:
def get_count_query(self):
q = Asset.query.join(StatusLabel).filter(StatusLabel.status == 'Deployable', or_(
Asset.assigned_to.isnot(None)),
Asset.deleted_at.is_(None))
return q.count()
Но это не удастся, как только он достигнет метода .scalar () (и я не могу удалить этот метод). Возникает вопрос: как применить func.count('*')
к существующему запросу?
Могу ли я извлечь фильтры из своего запроса и применить их к запросу func.count('*')
?