Thanks this did the trick, I agree, an option in relationship to
define how this behaves would be nice.

Cheers
Etrik

On Aug 17, 3:27 pm, Conor <conor.edward.da...@gmail.com> wrote:
> On 08/17/2010 11:21 AM, flzz wrote:
>
>
>
>
>
> > from sqlalchemy.ext.declarative import declarative_base
> > from sqlalchemy import create_engine, Column, Integer, String,
> > ForeignKey
> > from sqlalchemy.orm import sessionmaker, relationship
> > from sqlalchemy.orm.collections import attribute_mapped_collection
>
> > engine=create_engine('sqlite://', echo=True)
> > Base = declarative_base(engine)
>
> > def monkey_repr():
> >     def __repr__(self):
> >         """Show attribute values in the repr()."""
> >         simple_props = ', '.join('%s=%r' % (attr, value)
> >                                  for attr, value in
> > sorted(vars(self).items())
> >                                  if isinstance(value, (basestring,
> > int)))
> >         return '<%s (%s)>' % (type(self).__name__, simple_props)
> >     return __repr__
>
> > Base.__repr__ = monkey_repr()
>
> > class Company(Base):
> >     __tablename__ = 'companies'
> >     id = Column(Integer, primary_key=True)
> >     people = relationship('Person', lazy='joined',
>
> > collection_class=attribute_mapped_collection('name'))
>
> > class Person(Base):
> >     __tablename__ = 'people'
> >     id = Column(Integer, primary_key=True)
> >     _company_id = Column(Integer,  ForeignKey('companies.id'))
> >     name = Column(String)
> >     discriminator = Column('type', String(50))
> >     __mapper_args__ = {'polymorphic_on': discriminator}
>
> > class Engineer(Person):
> >     __tablename__ = 'engineers'
> >     __mapper_args__ = {'polymorphic_identity': 'engineer'}
> >     name = Column(String)
> >     department = Column(String)
> >     id = Column(Integer, ForeignKey('people.id'), primary_key=True)
> >     primary_language = Column(String(50))
>
> > class Accountant(Person):
> >     __tablename__ = 'accountants'
> >     __mapper_args__ = {'polymorphic_identity': 'accountant'}
> >     name = Column(String)
> >     bank = Column(String)
> >     id = Column(Integer, ForeignKey('people.id'), primary_key=True)
> >     primary_language = Column(String(50))
>
> > Base.metadata.create_all()
>
> > sess = sessionmaker()()
>
> > company = Company()
>
> > for p in [Engineer(name='far'),
> >           Person(name='nar'),
> >           Engineer(name='zar', department='rover'),
> >           Accountant(name='jak', bank='hsb')]:
> >     company.people.set(p)
>
> > sess.add(company)
> > sess.commit()
> > sess.expunge_all()
>
> > print "\n#\n# Query for the first company \n#\n"
> > c = sess.query(Company).first()
> > print c.people
> > print "\n#\n# This will issue another query even though lazy='joined'
> > \n#\n"
> > print c.people['zar'].department
>
> The easiest way is to add a "with_polymorphic" argument to
> Person.__mapper_args__:
>
> class Person(object):
>     [...]
>     __mapper_args__ = {'polymorphic_on': discriminator,
>                        'with_polymorphic': '*'}
>
> The downside is that this will always enable joinedloads on the subclass
> tables when loaded via relationships. Seems like it would be nice to add
> a "with_polymorphic" parameter to relationship().
>
> -Conor

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

Reply via email to