Hello everyone,

Trying to use hybrid_attribute to provide friendly names for integers
representing object states.  Storage and retrieval works fine, but I
can't get filtering working.  I want the translation to happen on the
Python side prior to filling in the query parameters, but
hybrid_attribute is thinking the DB should do it.  Example at the
bottom.

I don't really understand how to write the @state.expression the way I
want things to happen.

Thanks,
Ross




import sqlalchemy as sa
import sqlalchemy.orm as orm
from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method
from sqlalchemy.ext.declarative import declarative_base

engine = sa.create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()
Session = orm.scoped_session(orm.sessionmaker(autocommit=False,
                                              autoflush=False,
                                              bind=engine))
statei2a = {
    0 : "captured",
    1 : "registered",
    2 : "prepared",
}
statea2i = dict((v, k) for k, v in statei2a.iteritems())

class Device(Base):
    __tablename__ = "device"

    id = sa.Column(sa.Integer, primary_key=True)
    statenum = sa.Column(sa.Integer, nullable=False, default=0)

    def __init__(self, state):
        self.state = state

    @hybrid_property
    def state(self):
        return statei2a[self.statenum]

    @state.setter
    def state(self, state):
        self.statenum = statea2i[state]

    @state.expression
    def state(self):
        return statea2i[self.statenum]

Base.metadata.create_all(engine)

d1 = Device("captured")
d2 = Device("registered")
d3 = Device("prepared")
Session.add_all([d1, d2, d3])
Session.commit()

q = Session.query(Device)
q.filter_by(state="captured")
q.filter(Device.state > 0)

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to