Hi Michael,

Thank you for your response.
Unfortunately I have already tried to use the __init__ function/catch the 
init event but I am only referencing the sub classes in a relationship 
which does not seem to actually instantiate classes because the __init__ is 
never called/init event is never fired.
Here is a simple version of my models.

class HasSomeAttribute(object):
    @declared_attr.cascading
    def type(cls):
        if has_inherited_table(cls):
            if cls.__name__ == 'MySubClass1':
                return db.Column(db.Integer, default=1)
            else:
                return db.Column(db.Integer, default=2)
        else:
            return db.Column(db.Integer, default=0)
        
class MyClass(HasSomeAttribute, db.Model):
    __tablename__ = 'people4l2'
    id = db.Column(db.Integer, primary_key=True)
    id1 = db.Column(db.Integer)
    id2 = db.Column(db.Integer)

class MySubClass1(MyClass):
    pass
    
class MySubClass2(MyClass):
    pass

class Right(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    subclass_attr = relationship(
        'Contact',
        secondary= MySubClass1.__table__,
        primaryjoin='and_(MySubClass1.type == 802, MySubClass1.id2 == 
Right.id)',
        secondaryjoin='and_(MySubClass1.type == 802, MySubClass1.id1 == 
Left.id)'
    )

class Left(db.Model):
    id = db.Column(db.Integer, primary_key=True)

MyClass is used as a junction table for a bunch of different relationships, 
the type field is used to differentiate the relationships.


On Monday, March 30, 2015 at 5:26:30 PM UTC+2, Michael Bayer wrote:
>
>
>
> Pierre B <rocambol...@gmail.com <javascript:>> wrote: 
>
> > Hi all, 
> > 
> > I'm ultimately trying to have different default values for the same 
> column. Following the documentation, the @declared_attr.cacading decorator 
> seems to be the best approach. 
> > Here's my code: 
> > class HasSomeAttribute(object): 
> >     @declared_attr.cascading 
> >     def type(cls): 
> >         if has_inherited_table(cls): 
> >             if cls.__name__ == 'MySubClass1': 
> >                 return db.Column(db.Integer, default=1) 
> >             else: 
> >                 return db.Column(db.Integer, default=2) 
> >         else: 
> >             return db.Column(db.Integer, default=0) 
> >         
> > class MyClass(HasSomeAttribute, db.Model): 
> >     __tablename__ = 'people4l2' 
> >     id = db.Column(db.Integer, primary_key=True) 
> > 
> > class MySubClass1(MyClass): 
> >     pass 
> >     
> > class MySubClass2(MyClass): 
> >     pass 
> > 
> > I iterated quite a few times over this but I'm systematically getting 
> this error: 
> > ArgumentError: Column 'type' on class <class '__main__.MySubClass1'> 
> conflicts with existing column 'people4l2.type’ 
>
> this mapping illustrates MySubClass1 and MySubClass2 as both sharing the 
> same table “people4l2”, as they have no __tablename__ attribute, so there 
> can only be one “type” column. So in this case it is not appropriate to 
> use 
> cascading in exactly this way, as MyClass already has a “type” column, and 
> that gets attached to the “people4l2” table and that’s it; there can be no 
> different “type” column on MySubClass1/MySubClass2. 
>
> If you’d like “type” to do something different based on which class is 
> being 
> instantiated, this is an ORM-level differentiation. Use either the 
> constructor __init__() to set it or use the init() event 
> (
> http://docs.sqlalchemy.org/en/rel_0_9/orm/events.html?highlight=event%20init#sqlalchemy.orm.events.InstanceEvents.init).
>  
>
>
> OTOH if “type” is actually the “polymoprhic discriminator”, which is what 
> this looks like, then you’d be looking to just set up “type” as the 
> “polymorphic_on” column and set up the “1”, “2”, “0” as the polymorphic 
> identity (see 
>
> http://docs.sqlalchemy.org/en/rel_0_9/orm/inheritance.html#single-table-inheritance
>  
> for a simple example). 
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to