why have "B.field1d" and separate "B.field2id" then if a given A.id can only be in one and only one field1id/field2id ? If you had only one column you could at least apply a UNIQUE constraint to it and enforce the 1:1.
On Feb 2, 2012, at 4:31 PM, Manpreet Bhurji wrote: > Thanks Michael. Really appreciate the quick reply. > > A syntax error in the primary was the reason that back_populate did > not work. Fixing that solved it. > > I should have mentioned that field1 and field2 can only have a 1:1 > relationship towards A. I mean if field1 is assigned to an instance of > A, it can't be assigned to any other. So any instance of A will have > relationship "b" which only points to 1 B instance. > > The primary join in the A (when I am using back_populate) is now a > long string which will need to be edited if I ever change the model B. > Any ideas on how I might make this better? > > Regards, > Aman > > On Feb 2, 3:36 pm, Michael Bayer <[email protected]> wrote: >> On Feb 2, 2012, at 3:16 PM, Manpreet Bhurji wrote: >> >> >> >> >> >> >> >> >> >>> I have a structure like this >>> A.py >>> class A: >>> _some_fields >> >>> B.py >>> class B: >>> _field1id = Column(...) >>> _field1 = relationship( A.A, primaryjoin=lambda:A.A.id==B.field1id, >>> backref="b", uselist=False ) >>> _field2id = Column(...) >>> _field2 = relationship( A.A, primaryjoin=lambda:A.A.id==B.field2id, >>> backref="b", uselist=False ) >> >>> I know this will not work because the relationship field1 has already >>> created "b" on A. >>> I have tried using back_populates="b" in place of backref in class B >>> and adding >>> _b = relationship( "B", primaryjoin="or_(A.id==B.field1id, >>> A.id==B.field2id)" ) to A >> >>> Any ideas on how I would go about this? >> >> What object would A.b return if its "id" were present both in the "field1id" >> of one particular "B", and in the "field2id" of another ? Would A.b be a >> collection of both ? If so this requires a union of some kind, most easily >> done in Python. Naming the backrefs "b_from_field1" and "b_from_field2", >> we'd say: >> >> class A(Base): >> @property >> def b(self): >> return self.b_from_field1.union(self.b_from_field2) >> >> it's also possible to create a relationship A.b that selects from both >> field1id and field2id by creating a UNION and then mapping B to that union >> using non_primary=True, then using that mapper as the target of A.b, though >> this is a little more involved. >> >> In both cases A.b is read-only since it cant be determined if new B() >> entries would be established via the B._field1 relationship or the B._field2 >> relationship. > > -- > 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. > -- 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.
