Hi Tom, That was approximately what I was planning to do, I shall do some experimenting to see if I can do any more. I was just wondering if there was a clever feature for this sort of thing, as ORMs seem pretty magic already!
Thanks, Rich On Thursday, 30 July 2015 17:15:40 UTC+1, Tom Evans wrote: > > On Thu, Jul 30, 2015 at 4:08 PM, Rich Lewis <[email protected] > <javascript:>> wrote: > > Dear All, > > > > I'm new to the Django ORM, and quite new to ORMs in general. I have two > > models (lets call them A and B) between which I have an interesting > mapping. > > There are precisely 2 B instances associated with each A instance. Each > A > > instance can have many B instances. The order of Bs are important for > As. > > > > I want to do something like this: > > > > class A(models.Model): > > b_1 = models.ForeignKey(B) > > b_2 = models.ForeignKey(B) > > This would fail here, when you have more than one foreign key to the > same model, you must supply a related_name argument on one of them, > which is used for the inverse relation on the related object. Which > leads us in to... > > > > > class B(models.Model): > > pass > > > > Such that i can do: > > > >>>> b1, b2, b3 = B(), B(), B() > >>>> a1, a2 = A(b_1=b1, b_2=b2), A(b_1=b2, b_2=b3) > >>>> b2.as > > [<A ... >, <A ... >] #(order doesn't matter) > > Typically, B instances would have an attribute named 'a_set' (the > lower case model name of the model it is related to, with "_set" > appended). When you have multiple relationships with the same model, > as I mentioned you must supply your own related_name arguments. In > which case, with the models you mentioned, you could then do something > like this: > > >>> b2.a1_set.all() | b2.a2_set.all() > > [<A ..>, <A ..>] > > > > > I expect I could eventually do something a bit hacky that would work, > but > > what would be the best way to handle this? > > I would say the above is the hacky way. You could have the same B > assigned to b_1 and b_2 and would have duplicates in the set, and no > way to specify DB constraints to limit it. > > Given that you anticipate being able to retrieve all the A's for a > particular B, regardless of how they are related, I would model it as > a M2M with a through table holding any additional information about > the relationship, using the through table to add DB level constraints. > > Cheers > > Tom > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/daa601f5-12d5-44fe-8c58-f2f052629261%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.

