what it cant locate are foreign keys between the parent and child tables, "a" and "c"....because there arent any. when you have a many- to-many, the rules for figuring out the relationship change, and it knows to do that by the presence of the "secondary" argument.
so if you can manufacture a "secondary" table you can do this: secondary = a_b_table.join(b_c_table, onclause=a_b_table.c.b_id==b_c_table.c.b_id) mapper( A, a_table, properties={'cs': relation(C, secondary=secondary, primaryjoin=a_table.c.id==secondary.c.a_b_a_id, secondaryjoin=secondary.c.b_c_c_id==c_table.c.id, viewonly=True, ) } ) im not totally sure the lazy clause is going to work but try it out. this goes back to my general dislike of "viewonly" and how i cant generally support it, becuase as the rules for relationships get more strict and accurate, cases like these become harder to model. On Mar 28, 2007, at 10:39 AM, King Simon-NFHD78 wrote: > a_table = Table('a', metadata, > Column('id', Integer, primary_key=True), > Column('name', String(16)), > ) > > b_table = Table('b', metadata, > Column('id', Integer, primary_key=True), > Column('name', String(16)), > ) > > c_table = Table('c', metadata, > Column('id', Integer, primary_key=True), > Column('name', String(16)), > ) > > a_b_table = Table('a_b', metadata, > Column('a_id', Integer, ForeignKey('a.id'), > primary_key=True), > Column('b_id', Integer, ForeignKey('b.id'), > primary_key=True), > ) > b_c_table = Table('b_c', metadata, > Column('b_id', Integer, ForeignKey('b.id'), > primary_key=True), > Column('c_id', Integer, ForeignKey('c.id'), > primary_key=True) > ) > > class A(object): > pass > > class B(object): > pass > > class C(object): > pass > > mapper(B, b_table) > mapper(C, c_table) > > ############################################################# > # How can I create a mapper on A with a property that gives > # all the 'C' objects? > ############################################################# > # This doesn't work - it requires the foreign_keys parameter > # to be passed, but I don't know what to pass. > mapper( > A, a_table, > properties={'cs': relation(primaryjoin=and_(a_table.c.id == > a_b_table.c.a_id, > a_b_table.c.b_id == > b_c_table.c.b_id, > c_table.c.id == > b_c_table.c.c_id), > viewonly=True, > ) > } > ) --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---