Как использовать агрегатную функцию SUM в Flask SQLAlchemy? - PullRequest
1 голос
/ 05 апреля 2020

У меня есть простые классы:

class Terminal(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    terminal_id = db.Column(db.String(100), nullable = False)

    statistics = db.relationship('TerminalStatistic', backref='observed_terminal', lazy='dynamic')


    def all_statistics(self) -> int:
        todayDate = datetime.now()
        if todayDate.day > 25:
            todayDate += datetime.timedelta(7)

        first_day_of_month = todayDate.replace(day=1)

        return self.statistics.query(func.sum(TerminalStatistic.cash)).filter(TerminalStatistic.collection_date >= first_day_of_month)

    def __repr__(self):
        return "Terminal('{0}','{1}')".format(self.address, self.date_last_online)

class TerminalStatistic(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    terminal_id = db.Column(db.Integer, db.ForeignKey('terminal.id'))
    collection_date = db.Column(db.DateTime, nullable = False)
    cash = db.Column(db.Integer, nullable = True)   

Итак, Terminal связан с TerminalStatistic.
Теперь я хочу суммировать всю статистику в all_statistics(self), но получил ошибку:

return self.statistics.query(db.func.sum(TerminalStatistic.cash)).filter(TerminalStatistic.collection_date >= first_day_of_month)

AttributeError: 'AppenderBaseQuery' object has no attribute 'query'

Как сделать запросы с функциями к коллекциям в классах?

1 Ответ

0 голосов
/ 18 апреля 2020

Я нашел решение:

result = self.query.with_entities(db.func.sum(TerminalStatistic.cash).label("sum_statistics")).filter(
TerminalStatistic.terminal_id == self.terminal_id).first()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...