Я хочу, чтобы иметь возможность выполнить следующие SQLAlchemy запросов:SQLAlchemy - Boolean Гибридный Атрибут
q_done = Batch.query.filter(Batch.done)
q_running = Batch.query.filter(~Batch.done)
Но я не могу обернуть мою голову вокруг написания expression
, соответствующий моему гибридным атрибут done
.
SQLAlchemy модели:
class Action(db.Model):
id = db.Column(db.Integer, primary_key=True)
action = db.Column(db.String(32))
done = db.Column(db.Boolean, default=False)
batch = db.relationship(Batch.__name__, backref='actions')
class Batch(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), default='unknown')
@hybrid_property
def total_actions(self):
return db.session.query(Action).join(Action.batch).filter(Batch.id == self.id).count()
@hybrid_property
def finished_actions(self):
return db.session.query(Action).join(Action.batch).filter(Batch.id == self.id).filter(Action.done).count()
@hybrid_property
def done(self):
return self.total_actions == self.finished_actions
Я попытался реализовать соответствующий expression
без особого успеха. Трудно понять, как я могу вернуть логический запрос. Это моя скромная попытка:
@done.expression
def done(self):
total_actions = db.session.query(func.sum(Batch.actions))
finished_actions = db.session.query(func.sum(Batch.actions.done))
return db.session.query(Batch).filter(total_actions == finished_actions)
Попробуйте вызвать '.as_scalar()' на объект запроса – ThiefMaster