tags:

views:

57

answers:

2

For the below models:

class Customer(models.Model):
    id = models.IntegerField(primary_key=True)

class OrderA(models.Model):
    name = models.CharField(max_length=20)
    foo = models.FloatField()
    customer = models.ForeignKey(Customer)
    type = models.IntegerField()

class OrderB(models.Model):
    name = models.CharField(max_length=20)
    customer = models.ForeignKey(Customer)
    type = models.IntegerField()

I want to grab all the Customer objects with their related OrderA and OrderB objects in one go for a condition (where type in OrderA and OrderB equals 1)

A: 

select_related() will pre-populate the appropriate attributes:

Customer.objects.filter(ordera_set__type=1, orderb_set__type=1).select_related()
Ignacio Vazquez-Abrams
Are you sure the select_related works in this direction? In my understanding if you call it on OrderA or OrderB object then it will populate all the related Customer objects.
Vishal
+1  A: 

You're right in your comment to Ignacio that select_related works in the opposite direction.

I've written about a technique to do it in this direction on my blog (sorry about the plug).

Daniel Roseman