I think I understand what you trying to do

in fact polymorphic objects are load correctly in my test, I think it is
an approach to your case.
follow the code I used before to ask about polymorphic inheritance, note
to the Catalog class, this class have a resource list (catalog_id on
Resource), and I am inserting different types of resources, than when
select,
each resource is loaded correctly with their type

---code------8<------code-----

from sqlalchemy import create_engine, MetaData, Table, Column, types,
ForeignKey
from sqlalchemy.orm import mapper, relation, backref, create_session
from sqlalchemy.sql.expression import outerjoin, join
from sqlalchemy import String, Unicode, Integer, DateTime, Numeric,
Boolean, UnicodeText


db = create_engine('sqlite:///:memory:')

metadata = MetaData()
metadata = MetaData(db)
metadata.bind = db
session = create_session(bind=db)


resource_table = Table('resource', metadata,
    Column('id',Integer, primary_key=True),
    Column('name', String(30)),
    Column('catalog_id', Integer, ForeignKey('catalog.id')),
    Column('poly', String(31), nullable=True)
)

person_table = Table('person', metadata,
    Column('id',Integer, ForeignKey('resource.id'), primary_key=True,),
)

material_table = Table('material', metadata,
    Column('id',Integer, ForeignKey('resource.id'), primary_key=True,),
)

employee_table = Table('employee', metadata,
    Column('id',Integer, ForeignKey('person.id'), primary_key=True),
)

technical_table = Table('technical', metadata,
    Column('id',Integer, ForeignKey('person.id'), primary_key=True),
)

catalog_table = Table('catalog', metadata,
    Column('id',Integer, primary_key=True),
)

catalog_resources = Table('catalog_resources', metadata,
    Column('id', Integer, primary_key=True),
    Column('resource_id',Integer, ForeignKey('resource.id')),
)

class Resource(object):
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "Resource < id=%d ,name=%s >" % (self.id,self.name)

class Person(Resource):
    def __repr__(self):
        return "Person < id=%d ,name=%s >" % (self.id,self.name)

class Material(Resource):
    def __repr__(self):
        return "Material < id=%d ,name=%s >" % (self.id,self.name)

class Employee(Person):
    def __repr__(self):
        return "Employee < id=%d ,name=%s >" % (self.id,self.name)

class Technical(Person):
    def __repr__(self):
        return "Technical < id=%d ,name=%s >" % (self.id,self.name)

class Catalog(object):
    def __repr__(self):
        return "catalog < id=%d resources=%s >" %
(self.id,str([str(r)+',' for r in self.resources]))


mapper(Resource, resource_table,
    polymorphic_on=resource_table.c.poly,
    polymorphic_identity='resource',
    )

mapper(Person, person_table, 
    inherits=Resource, polymorphic_identity='person',
    polymorphic_on= resource_table.c.poly, 
    )

mapper(Material, material_table, 
    inherit_condition= material_table.c.id == resource_table.c.id, 
    inherits=Resource, polymorphic_identity='material'
    )

mapper(Employee, employee_table,
    inherit_condition= employee_table.c.id == person_table.c.id, 
    inherits=Person, polymorphic_identity='employee',
    )

mapper(Technical, technical_table,
    inherit_condition= technical_table.c.id == person_table.c.id, 
    inherits=Person, polymorphic_identity='technical',
    )

mapper(Catalog, catalog_table,
    properties={
        'resources':relation(Resource)
    })


metadata.create_all(bind=db)


r = Resource('resource name')
p = Person('person name')
m = Material('material name')
e = Employee('employee name')
t = Technical('technical name')
x = Catalog()

x.resources = [p,m,e,t]

session.save(r)
session.save(p)
session.save(m)
session.save(e)
session.save(t)
session.save(x)

session.flush()
session.clear()
print "############ LIST FROM RESOURCES #################"

for o in session.query(Resource).all():
    print o, o.poly

print "############ LIST FROM PERSONS #################"

for o in session.query(Person).all():
    print o, o.poly

print "############ Catalog #################"
y= session.query(Catalog).one()
print y


---code------8<------code-----

I Hope it helps you

Att

-- 
Alexandre da Silva
Analista de Sistemas - Bacharel em Sistemas de Informação (2003-2007)


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

Reply via email to