2017-01-27 9 views
2

は、私は次のSQLAlchemyのクエリを実行できるようにしたい:SQLAlchemyのブールハイブリッド属性

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

をしかし、私は私のdoneハイブリッド属性に対応するexpressionを書くのまわりで私の頭をラップすることはできません。

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) 
+1

クエリオブジェクトに '.as_scalarを()'を呼び出すしてみてください。ここでは

は完全なコードです – ThiefMaster

答えて

0

問題がtotal_actionsfinished_actionsは両方hybrid attributesあり、したがってdoneためexpressionで使用することができないということです。これは私の謙虚な試みです。

値の代わりにクエリを返すそれぞれに対応するexpressionを追加する必要がありました。

​​
関連する問題