I am attempting to use STI with mixins on the derived/inheriting
classes. If the mixin has a simple Column, everything works great. But
when I have a ForeignKey on the Column, and therefore use the
`declared_attr` decorator, I get an exception when I attempt to query
the child collection.
For the example below, querying the Engineer class throws the
following exception:
InvalidRequestError: Class <class 'Person'> does not have a mapped
column named 'target_id'
Here's some code:
class Person(Base):
id = Column(Integer, primary_key=True)
type = Column('type', String(50))
@declared_attr
def __tablename__(cls):
if has_inherited_table(cls):
return None
return cls.__name__.lower()
@declared_attr
def __mapper_args__(cls):
if cls.__name__ == 'Person':
mapper_args = {}
mapper_args['polymorphic_on'] = cls.type
return mapper_args
else:
return {"polymorphic_identity": cls.__name__}
class Mixin(object):
simple_column = Column(Integer, nullable=True) # This column
is mapped correctly
@declared_attr
def target_id(cls): # But when I have a column with a
ForeignKey, and I used `declared_attr` - everything breaks down
return Column('target_id', ForeignKey('target.id'))
@declared_attr
def target(cls): # Relationships also work correctly, if
target_id is defined in the Person class
return relationship("Target")
class Engineer(Person, Mixin):
pass
I know I can get around this by declaring the target_id on the Person
class but then I lose the encapsulation provided by the Mixin class.
Why does declaring a simple Column on the Mixin work perfectly, but
fail when declaring a column using the `declared_attr` decorator?
--
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.