On Thu, 2008-05-15 at 11:30 -0400, J. Cliff Dyer wrote: > On Thu, 2008-05-15 at 11:24 -0400, J. Cliff Dyer wrote: > > I'm trying to implement polymorphic inheritance using the > > sqlalchemy.ext.declarative, but the field that I want to use for the > > polymorphic_on is not in my polymorphic base table, but at the other end > > of a many-to-one relationship. We have items of many types, and in the > > item table, we have a type_id field which contains an integer, but in > > the item_type table, that integer is mapped to a descriptive name. > > Essentially, I'd like to use that name as my polymorphic_identity. I've > > tried to implement this with declarative classes below, but I get an > > error, also shown below. > > > >
OK. The old example was wrong in other ways. That was a problem with __table__ vs. __tablename__, but I got past that, and got my polymorphism working on the basic case, where I just use the type_id directly as follows: class ItemType(Declarative): __tablename__ = 'item_type' type_id = sa.Column('type_id', sa.Integer, primary_key=True) description = sa.Column('description', sa.Unicode(250)) class Item(Declarative): __tablename__ = 'item' item_id = sa.Column('item_id', sa.Integer, primary_key=True) type_id = sa.Column('type_id', sa.Integer, sa.ForeignKey('item_type.type_id')) short_title = sa.Column('short_title', sa.Unicode(100)) item_type = orm.relation('ItemType', backref='items') __mapper_args__ = {'polymorphic_on': type_id } But I'd still like to do something like this: __mapper_args__ = {'polymorphic_on': item_type.description } but I get the following error: Traceback (most recent call last): File "polymorph_test.py", line 28, in ? class Item(Declarative): File "polymorph_test.py", line 34, in Item __mapper_args__ = {'polymorphic_on': item_type.description } AttributeError: 'PropertyLoader' object has no attribute 'description' or from the following: __mapper_args__ = {'polymorphic_on': ItemType.description } Traceback (most recent call last): File "polymorph_test.py", line 28, in ? class Item(Declarative): File "/net/docsouth/dev/lib/python/sqlalchemy/ext/declarative.py", line 257, in __init__ cls.__mapper__ = mapper_cls(cls, table, properties=our_stuff, **mapper_args) File "/net/docsouth/dev/lib/python/sqlalchemy/orm/__init__.py", line 566, in mapper return Mapper(class_, local_table, *args, **params) File "/net/docsouth/dev/lib/python/sqlalchemy/orm/mapper.py", line 181, in __init__ self.__compile_properties() File "/net/docsouth/dev/lib/python/sqlalchemy/orm/mapper.py", line 684, in __compile_properties col = self.mapped_table.corresponding_column(self.polymorphic_on) or self.polymorphic_on File "/net/docsouth/dev/lib/python/sqlalchemy/sql/expression.py", line 1735, in corresponding_column target_set = column.proxy_set File "/net/docsouth/dev/lib/python/sqlalchemy/orm/mapper.py", line 638, in __getattribute__ return getattr(getattr(cls, clskey), key) AttributeError: 'InstrumentedAttribute' object has no attribute 'proxy_set' How can I use this field for polymorphism? Is it possible? --~--~---------~--~----~------------~-------~--~----~ 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 [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---