On Aug 17, 2010, at 5:05 PM, flzz wrote:

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

its a long term TODO.   


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

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