ok, thanks for your aswers, I'll try it tonight.

2010/8/17 Michael Bayer <mike...@zzzcomputing.com>

>
> On Aug 16, 2010, at 4:20 AM, jean-philippe serafin wrote:
>
> AbstractA is AbstractB "base" class.........
> AbstractB is ClassA "base" class............
>
> Everything work fine in this case.
>
> I just want to set 'polymorphic_identity' on each inheritance level
> if I set by hand : update abstract_a set class_name = 'class_a' :
> AbstractA.query.first() give me back a ClassA object
>
>
>
> The reason you can't easily set "class_name" on the base is that you've
> named the attribute the same thing on both AbstractA and AbstractB.  So
> AbstractB.class_name will never affect the basemost attribute on AbstractA.
>   If you name them differently, your constructor can ensure they are set:
>
>    def __init__(self, label):
>
>        self.label = label
>        self.class_name_a = self.class_name_b = self.__tablename__
>
> But what works better, merge them on AbstractB (still remove the
> unnecessary polymorphic_on from B, however), the value gets propagated to
> that of AbstractB:
>
> class AbstractA(Base):
>
>    __tablename__ = "abstract_a"
>
>    id = Column(Integer, primary_key=True)
>    class_name = Column('class_name', String(50))
>
>    __mapper_args__ = {
>        'polymorphic_on': class_name,
>    }
>
> class AbstractB(AbstractA):
>
>    __tablename__ = "abstract_b"
>
>    id = Column(Integer, ForeignKey('abstract_a.id'),primary_key=True)
>    class_name = column_property(Column('class_name', String(50)),
> AbstractA.__table__.c.class_name)
>
>    __mapper_args__ = {
>        'polymorphic_identity': __tablename__,
>    }
>
>
> Note however, it is not possible to load a ClassA object without querying
> at the very least "abstract_a".   So the "class_name" column of "abstract_a"
> is always available with regular polymorphic querying.  Its redundant and
> less normalized to have "class_name" on both tables with the same value
>  (technically its not normalized in the first place to have a discriminator
> column at all, though it has a dramatically positive effect on our ability
> to locate subtypes without many outer joins).   So there's no reason I can
> think of why you'd want class_name on B.   But even if you did, there's
> still no reason to ever put polymorphic_on on a non-base table with the
> current implementation, and that should still be changed to emit a warning
> (#1880)- even here it would have alerted you to the issue.
>
>
>
>
>
> 2010/8/15 Michael Bayer <mike...@zzzcomputing.com>
>
>>
>> On Aug 15, 2010, at 6:52 AM, jean-philippe serafin wrote:
>>
>> > Hi,
>> >
>> > I've got a class mapping with two polymorphic inheritance :
>> >
>> > class AbstractA(Base):
>> >
>> >    __tablename__ = "abstract_a"
>> >
>> >    id = Column(Integer, primary_key=True)
>> >    class_name = Column('class_name', String(50))
>> >
>> >    __mapper_args__ = {
>> >        'polymorphic_on': class_name,
>> >    }
>> >    #some stuff here
>> >
>> > class AbstractB(AbstractA):
>> >
>> >    __tablename__ = "abstract_b"
>> >
>> >    id = Column(Integer, ForeignKey('abstract_a.id'),
>> > primary_key=True)
>> >    class_name = Column('class_name', String(50))
>> >
>> >    __mapper_args__ = {
>> >        'polymorphic_on': class_name,
>> >        'polymorphic_identity': __tablename__,
>> >    }
>> >    #some stuff here
>> >
>> > class ClassA(AbstractB):
>> >
>> >    __tablename__ = "table_a"
>> >    __mapper_args__ = {
>> >        'polymorphic_identity': __tablename__,
>> >    }
>> >
>> >    id = Column(Integer, ForeignKey('abstract_b.id'),
>> > primary_key=True)
>> >    label = Column('label', String(50))
>> >
>> >    def __init__(self, label):
>> >        self.label = label
>> >
>> > I persist a ClassA object :
>> >
>> > object = ClassA('toto')
>> > db_session.add(object)
>> > db_session.commit()
>> >
>> > When I try to reload the object like this :
>> >
>> > reloaded_object = AbstractB.query.first()
>> >
>> > I get back a ClassA object (just fine)
>> >
>> > but when I try to reload like this :
>> >
>> > reloaded_object = AbstractA.query.first()
>> >
>> > I get back a AbstractA object because abstract_a.class_name has not
>> > been set to polymorphic_identity.
>> >
>> > Is this an issue or expected work?
>>
>> polymorphic_on only goes on the base class.    SQLA should be changed to
>> raise an error on the setup you have above.
>>
>>
>> >
>> > --
>> > 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<sqlalchemy%2bunsubscr...@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<sqlalchemy%2bunsubscr...@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.
>
>
>  --
> 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<sqlalchemy%2bunsubscr...@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