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.

Reply via email to