SQLAlchemy布尔混合属性

2024-05-17 13:35:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够运行以下SQLAlchemy查询:

q_done = Batch.query.filter(Batch.done)
q_running = Batch.query.filter(~Batch.done)

但是我不能把精力集中在写与我的done混合属性相对应的expression。在

SQLAlchemy模型:

^{pr2}$

我试图实现相应的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)

Tags: actionsdbsqlalchemysessionbatchfilterqueryrunning
1条回答
网友
1楼 · 发布于 2024-05-17 13:35:23

问题是total_actionsfinished_actions都是hybrid attributes,因此不能在expression中用于done。在

我必须为每个返回查询而不是值的函数添加相应的expression。在

以下是完整代码:

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)

    @hybrid_property
    def total_actions(self):
        return db.session.query(Action).join(Action.batch).filter(Batch.id == self.id).count()

    @total_actions.expression
    def total_actions(cls):
       return (select([func.count(Action.id)]).
                where(Action.bid == cls.id).
                label("total_actions"))

    @hybrid_property
    def finished_actions(self):
        return db.session.query(Action).join(Action.batch).filter(Batch.id == self.id).filter(Action.done).count()

    @finished_actions.expression
    def finished_actions(cls):
       return (select([func.count(Action.id)]).
                where(Action.bid == cls.id).
                where(Action.done).
                label("finished_actions"))

    @hybrid_property
    def done(self):
       return self.total_actions == self.finished_actions

    @done.expression
    def done(cls):
       return cls.total_actions == cls.finished_actions

相关问题 更多 >