that's a bug as the example earlier is almost the same thing w/ declarative. ticket #2323
On Nov 11, 2011, at 10:48 AM, Vlad K. wrote: > > Ah, so, thanks. My logic was that I could specify which foreign_key to use > for the relationship, which is basically a subset of primaryjoin condition, > but in my opinion "cleaner". So, that wouldn't work? I must use always use > primaryjoin? > > > > I was looking at few paragraphs below, under Multiple Relationships against > the same Parent/Child, which is basically my situation, and shows a mapper > based solution. > > http://www.sqlalchemy.org/docs/orm/relationships.html#multiple-relationships-against-the-same-parent-child > > > > Thanks for help! > > .oO V Oo. > > > On 11/11/2011 07:32 PM, Michael Bayer wrote: >> On Nov 11, 2011, at 3:46 AM, Vlad K. wrote: >> >>> Hi, >>> >>> >>> I have two models, A and B. Model B contains two foreign keys into table A, >>> because it is a "comparator" model that describes certain logical >>> interaction between two A models. However, I want model B to contain a >>> relationship to both so I can access them through the model B instance: >>> >>> >>> class ModelB(Base): >>> __tablename__ = ... >>> >>> id_b = ... # primary >>> some_comparison_data = ... >>> >>> main_model_id = Column(Integer, ForeignKey("models_a.id_a", >>> ondelete="cascade", onupdate="cascade")) >>> duplicate_model_id = Column(Integer, ForeignKey("models_a.id_a", >>> ondelete="cascade", onupdate="cascade")) >>> >>> main_model = relationship("ModelA", foreign_keys=[ ??? ], lazy="joined") >>> duplicate_model = relationship("ModelA", foreign_keys=[ ??? ], >>> lazy="joined") >>> >>> >>> >>> ModelA has no keys back to B, this is basically a "one-to-two" relationship >>> from B to A. >> I would classify this as two distinct "many to one" relationships from B to >> A. >> >> >>> Now as you can see I don't know what to specify for foreign keys. >> You don't need to specify foreign_keys here as the Column objects on ModelB >> already have valid ForeignKey objects back to ModelA. You do however need >> to specify "primaryjoin" for each relationship() here, as it is otherwise >> ambiguous how a join from ModelB to ModelA should proceed: >> >> main_model = relationship("ModelA", >> primaryjoin="ModelA.id_a==ModelB.main_model_id") >> duplicate_model = relationship("ModelA", >> primaryjoin="ModelA.id_a==ModelB.duplicate_model_id") >> >> >>> I tried with foreign_keys=[main_model_id] and >>> foreign_keys=[duplicate_model_id] but it complains it couldn't determine >>> join condition and that I should use primaryjoin. Evenso I wouldn't know >>> how to use it because I don't know what to specify: class variable? a >>> string? The examples in the docs are not for declarative... >> I'm always looking to improve the documentation. In this case, all examples >> in the "relationship" documentation now use declarative for most examples, >> including "primaryjoin": >> >> http://www.sqlalchemy.org/docs/orm/relationships.html#specifying-alternate-join-conditions-to-relationship >> >> It's also in the declarative extension docs: >> >> http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#configuring-relationships >> >> Perhaps you were looking at older documentation ? >> >> > > -- > 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.