2017-02-27 109 views
4

我嘗試使用SQLAlchemy的混合屬性這樣SQLAlchemy的 - 在查詢

class Metric(Base): 
    __tablename__ = 'metric' 
    id = Column(Integer, primary_key=True) 
    value = Column(Float, nullable=False) 

    @hybrid_property 
    def dominance(self): 
     return 1 - abs(0.5 - float(self.value)) 

現在,我用這個在我的模型是這樣

class MetricModel(BaseModel): 
    def get_dominance(self): 
     self.query(Metric).filter(Metric.dominance > 0.5).order_by(Metric.dominance.desc()).limit(2).all() 

這種採用混合性質是一個燒瓶應用程序,它被稱爲像這樣

model = MetricModel(db) 
with db.session(): 
    print(model.get_dominant_traits()) 

這給了我一個錯誤 TypeError: float() argument must be a string or a number, not 'InstrumentedAttribute' 從錯誤它看起來像沒有結果集,因此失敗。我按照這裏的文檔http://docs.sqlalchemy.org/en/latest/orm/extensions/hybrid.html 我應該做什麼不同?

回答

4

您需要創建expression

from sqlalchemy import func 

class Metric(Base): 
    __tablename__ = 'metric' 
    id = Column(Integer, primary_key=True) 
    value = Column(Float, nullable=False) 

    @hybrid_property 
    def dominance(self): 
     return 1 - abs(0.5 - self.value) 

    @dominance.expression 
    def dominance(cls): 
     return 1 - func.abs(0.5 - cls.value)