On Jan 9, 2012, at 11:19 AM, Michael Bayer wrote:
> The first thing I note here is, if I were doing a model like this, I'd either
> use two different association tables between Product->Origin and
> Product->Food, or I'd make one relationship(), and handle the filtering in
> Python (which is essentially what you're wishing SQLAlchemy did here). The
> ORM wants to know about your table relationships which here is just
> A->assoc->B. All of the issues here, some of which I consider to be SQLA
> bugs anyway, would go away if you did it in that manner, subqueryloading
> would be efficient, etc.
Here's an event that does what you need:
from sqlalchemy.orm import attributes
from sqlalchemy import event
class Product(Base):
__tablename__ = "product"
id = Column(Integer, autoincrement=True, primary_key=True)
options = relationship(SearchOption, secondary=product_searchoption_table)
origin = relationship(OriginOption, uselist=False,
secondary=product_searchoption_table)
foods = relationship(FoodOption,
secondary=product_searchoption_table)
@event.listens_for(Product, "load")
def mything(target, context):
if 'options' in target.__dict__:
attributes.set_committed_value(
target, 'foods',
[o for o in target.options if o.discriminator=='food']
)
origin = [o for o in target.options if o.discriminator=='origin']
attributes.set_committed_value(
target, 'origin',
origin[0] if origin else None
)
# only 2 queries
for row in session.query(Product).options(subqueryload(Product.options)):
print row, row.origin, row.foods
if I added an onload event for individual relationship attributes that would
make this event a little more targeted.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.