On 10/29/2010 09:43 AM, Hector Blanco wrote: > Hello list... > > I wrote a couple of days ago about how to model an structure of three > classes > (http://groups.google.com/group/sqlalchemy/browse_thread/thread/5ba5c4ad16f789d6#). > I thing I almost have it, but I am still getting problems mapping an > structure like this. > > class Child(rdb.Model): > def __init__(self): > self.field1 = “hello world” > > class Parent(rdb.Model): > def __init__(self): > self.child1 = Child() > self.child2 = Child() > > The “Parent” class has two different instances of a Child() class. I > am not even sure about how to treat this (two different 1:1 > relationships or a 1:2 relationship). > > My last try is this mapping: > > (don't let the rdb.Model thing fool you, is just something that > automatically maps the class to the table specified in rdb.tablename). > > class Child(rdb.Model): > rdb.metadata(metadata) > rdb.tablename("children_table") > id = Column("id", Integer, primary_key=True) > field1 = Column(“field1”, String(64)) #Irrelevant > def __init__(self): > self.field1 = “hello world” > > class Parent(rdb.Model): > rdb.metadata(metadata) > rdb.tablename("parent_table”) > > id = Column("id", Integer, primary_key=True) > child1_id = Column("child_1_id", Integer, > ForeignKey("children_table.id")) > child2_id = Column("child_2_id", Integer, > ForeignKey("children_table.id")) > > child1 = relationship(Child, > primaryjoin = (child1_id=="children_table.id") > ) > > child2 = relationship(Child, > primaryjoin = (child2_id=="children_table.id") > ) > > I have tried (almost) everything. I say “almost” because obviously I > haven't tried the right thing. I keep getting errors that sqlalchemy > can't determine the relationship between the two tables. > > It looks very similar to: > http://www.sqlalchemy.org/docs/orm/relationships.html#multiple-relationships-against-the-same-parent-child > > but I also understand that maybe I can't get this working that way, > because I am actually putting two ForeignKeys from the same table > (“children_table”) in the parent table. I am not sure how that will > work out, or is correct or what... :-( > > Thank you!
Usually we consider the table with the foreign key as the "child" table, but that's just being picky. The problem is that SQLAlchemy is treating "children_table.id" as a literal instead of a clause, so your join would be like (parent JOIN child ON parent.child1_id = 'children_table.id'). Obviously that is not what you want. There are several ways to formulate primaryjoin/secondaryjoin. Pass the whole thing in as a string: child1 = relationship(Child, primaryjoin="Parent.child1_id == Child.id") Use the column objects directly (this requires that Child be defined before Parent): child1 = relationship(Child, primaryjoin=child1_id==Child.id) Use a callable (my favorite): child1 = relationship(Child, primaryjoin=lambda: Parent.child1_id == Child.id) -Conor -- 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.
