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 sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to