19

I am trying to use a SQLAlchemy hybrid property like this

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

Now, I use this in my model like this

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

This is a flask app and it's being called like this

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

This gives me an error TypeError: float() argument must be a string or a number, not 'InstrumentedAttribute' From the error it looks like there is no result set, hence the failure. I followed the docs here http://docs.sqlalchemy.org/en/latest/orm/extensions/hybrid.html What should I do differently?

1 Answer 1

28

You need to create 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)
Sign up to request clarification or add additional context in comments.

2 Comments

This link provides a pretty good explanation docs.sqlalchemy.org/en/13/orm/mapped_sql_expr.html
But what if the data is on the instance level and different for every object (using another hybrid property in the expression)?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.