On Feb 11, 2010, at 6:45 AM, Andrija Zarić wrote: > Thanks, Mike! > > Your example indeed works, but unfortunately when I add inheritance, > mapper fails to generate proper (inherited) class: > (I've changed code a little, so it represents more what I'm trying to > do)
> class ValueItem(Item): > __mapper_args__ = { 'polymorphic_identity' : 'quantity' } > value = Column('quantity_value', Numeric(15, 4)) > > > class ErrorItem(Item): > __mapper_args__ = { 'polymorphic_identity' : 'error' } > value = Column('error_value', String(15, 4)) I'm assuming these are single-table inheritance mappers (I forgot about that "add the column" trick..) So yeah my solution was a quick hack and to continue in this way you'd have to build non-primary mappers for each of ValueItem, ErrorItem that state "inherits" for the original non-primary mapper, using the polymorphic identities as well. It would still work. If you don't care much about a high-scaling query you could ditch the secondary mapper idea and order by a subquery, like detail_alias = Detail.__table__.alias() class Order(Base): items = relation(Item, order_by=select([detail_alias.c.id]).where(detail_alias.c.id==Item.__table__.c.detail_id).alias()) again somehting i haven't tried, but should work in theory. > > from sqlalchemy import * > from sqlalchemy.orm import * > from sqlalchemy.ext.declarative import declarative_base > > engine = create_engine('sqlite://', echo=True) > Base = declarative_base() > > class Detail(Base): > __tablename__ = 'detail' > id = Column(Integer, primary_key=True) > sort = Column(Integer) > > class Order(Base): > __tablename__ = 'order' > id = Column(Integer, primary_key=True) > > class Item(Base): > __tablename__ = 'item' > id = Column(Integer, primary_key=True) > order_id = Column(Integer, ForeignKey('order.id')) > detail_id = Column(Integer, ForeignKey('detail.id')) > > detail = relation(Detail, uselist=False, lazy=False) > order = relation(Order, uselist=False) > type = Column(String(20)) > __mapper_args__ = { 'polymorphic_on' : type} > > > class ValueItem(Item): > __mapper_args__ = { 'polymorphic_identity' : 'quantity' } > value = Column('quantity_value', Numeric(15, 4)) > > > class ErrorItem(Item): > __mapper_args__ = { 'polymorphic_identity' : 'error' } > value = Column('error_value', String(15, 4)) > > > Order.items = relation(Item) > j = Item.__table__.join(Detail.__table__) > itemdetail = mapper(Item, j, non_primary=True) > Order.sorteditems = relation(itemdetail, > order_by=Detail.__table__.c.sort, viewonly=True) > > metadata = Base.metadata > metadata.create_all(engine) > Session = scoped_session(sessionmaker(bind=engine)) > > order = Order(id=1) > Session.add(order) > detail = Detail(id=1, sort=1) > order.items.append(ValueItem(id=1, detail=detail)) > > Session.commit() > > for order in Session.query(Order).all(): > for item in order.sorteditems: > print item > for item in order.items: > print item > > ... > <__main__.Item object at 0x881ddac> > > <__main__.ValueItem object at 0x960da6c> > > > Am I making a obvious mistake somewhere here? > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@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. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@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.