One more thing Extra should also be related to other classes, not only ones setup "polymorphic"
Like: class dummy(Base): ID = Column (Integer,Primary_key=True) # Set up foreignkey and relation to Extra.... __table_args__ = (ForeignKeyConstraint([<<<<<This tables tablename>>>>, 'Id'], ['extra.Table','extra.TableId']),{}) # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ extras = relation('Extra', cascade="all", lazy="dynamic" backref="owner") I do not really want to add a discriminator to the "Dummy" table for this relation to work This to explain: >> yeah, sorry, this use case continues to be 98% opaque to me. I don't >> understand what you mean by "make someotherclass work with non-polymorphic >> tables", a class is mapped in just one way, either with or without a >> discriminator column. A single class can't be mapped in both ways. If >> there's no discriminator, there's just one class that can be used for >> returned rows. Martijn On Feb 12, 2011, at 15:57 , Martijn Moeling wrote: > This whole thing is driving me crazy, What I want: > > > > class Extra(Base): > __tablename__ = "extra" > # Primary key consists of two different columns !!! > tableId = Column(Integer, > primary_key=true) > tablename = Column(Unicode(20), > primary_key=True) > > info = Column(........) #Not > relevant > > > > > class ex1(Base): > Id = Column(Integer, primary_key=True) > discriminator = Column(Unicode(20)) > > @declared_attr > def __tablename__(self): > return self.__name__.lower() > > @declared_attr > def __mapper_args__(self): > if self.__name__ == 'ext1': > return {'polymorphic_on': self.discriminator, > 'polymorphic_identity':unicode(self.__name__.lower()), > 'extension': FilePropertiesMapperExtension(), > 'batch' : False} > else: > return {'polymorphic_identity':unicode(self.__name__.lower()), > 'inherit_condition': self.Id == extra.Id, > #needed for something else in this config (multiple > self reference) > 'extension': FilePropertiesMapperExtension(), > #Needed for something else, not relevant for this sample > 'batch' : False} > # ,, ,, > ,, ,, > > > # Set up foreignkey and relation to Extra.... > __table_args__ = (ForeignKeyConstraint(['discriminator', 'Id'], > ['extra.Table','extra.TableId']),{}) > > > extras = relation('Extra', cascade="all", lazy="dynamic" > backref="owner") > > > .... > .... > > > class ext2(ext1): > Id = Column(Integer,ForeignKey('ext1.Id'), > primary_key=True) > ...... > > > class ext3(ext1): > Id = Column(Integer,ForeignKey('ext1.Id'), > primary_key=True) > ..... > > > > > Now I want: > > Ext2 = ext2() > Extra_info = extra() > Ext2.extras.append(Extra_Info) > > > Ext2.discriminator should be "ext2" > Ext2.Id should be 1 for the first record > > Extra_Info should be created in the database, with its columns : id set to > the Ext2.id and tablename to Ext.discriminator ...... > Extra_Info.owner would point to Ext2 > > If Ext2 is deleted, all related extrainfo record would be delete too > > if one Extra_Info is deleted, Extra_Info.owner should stay in place as well > as all other related > > Extra is many to one polymorhic version of ext1 > > I hope this clarifies more what I want.... > > I really need the @declared_attr way of doing stuff and that is not related > to this question but might influence this question so I left it in...... > > Martijn > > > On Feb 10, 2011, at 18:13 , Michael Bayer wrote: > >> >> On Feb 10, 2011, at 4:20 AM, Martijn Moeling wrote: >> >>> Another small thing: >>> >>> I took a look at: >>> >>> ForeignKeyConstraint(['invoice_id', 'ref_num'], ['invoice.invoice_id', >>> 'invoice.ref_num']) >>> >>> Now for Polymorphic tables: >>> >>> >>> in baseclass: >>> >>> baseclass.discriminator happens to be the __tablename__ of the polymorphic >>> >>> ForeignKeyConstraint('['baseclass.disciminator', baseclass.Id'], >>> ['someotherclass.tablename','someotherclass.tableId'] >>> relationship('someotherclass', backref=baseclass, cascade="all", >>> lazy="dynamic") >>> >>> >>> in someotheclass: >>> >>> tablename = column(Unicode(20), primary_key=True) >>> tableId = column(Integer, primary_key=True) >>> >>> seems Ok to me. >>> >>> Now I need to make someotherclass work with non-polymorphic tables too!! >>> >>> anotherclass: >>> Id = column(Integer, primary_key=True) >>> >>> ForeignKeyConstaint('[anotherclass.__tablename__,'anotherclass.Id'],['someotherclass.tablename','someotherclass.tableId']) >>> relation('someotherclass', backref=baseclass, cascade="all", >>> lazy="dynamic") >>> >>> Is there any way to get this working without configuring it as polymorphic >>> an do no Inhiritance, I do not want each anotherclass record to have a >>> column discriminator with its own tablename! >>> >>> or can I use anotherclass.__tablename__ in the ForeignKeyConstaint? >>> >>> This has to do with the someotherclass being the "ACL" I talked about in a >>> previous post if that gives extra info. I am trying to implement the >>> MapperExtension.before_append where I need to refer to the "ACL" records in >>> a way like: >>> >>> for A in instance.ACL: >>> ..... >> >> yeah, sorry, this use case continues to be 98% opaque to me. I don't >> understand what you mean by "make someotherclass work with non-polymorphic >> tables", a class is mapped in just one way, either with or without a >> discriminator column. A single class can't be mapped in both ways. If >> there's no discriminator, there's just one class that can be used for >> returned rows. >> >> If you could create a small test that illustrates a mapping and an expected >> result, perhaps I can attempt to find a way to get the ORM behavior you're >> looking for. >> >> Your mapper extension would continue to be used normally with a "dynamic" >> relationship since it uses query(cls) just like a regular query. >> >> >> >> -- >> 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 >> 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 sqlalchemy@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 sqlalchemy@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.