2010-09-21 48 views
1

看看这个模型(这是假设):Django的一个艰难的关系

class Manufacturer(models.Model): 
    #... 

class Car(models.Model): 
    manufacturer = models.ForeignKey(Manufacturer) 
    #... 

class City(models.Model): 
    #... 

class Manager(models.Model): 
    manufacturer = models.ForeignKey(Manufacturer) 
    city = models.ForeignKey(City) 
    #... 

我想查询的是:汽车及其制造商的经理的列表(假设这不是重要的几个条件在问题中)以及他们的城市。这可以在某种程度上通过下面的代码来完成:

manager_car = defaultdict(list) 
cars = Car.objects.select_related('manufacturer').filter(...) 
for car in cars: 
    managers = car.manufacturer.manager_set.select_related('city').filter(...) 
    for manager in managers: 
     #if <optional condition>: 
     manager_car[manager].append(car) 

会在词典列表,制造商的汽车的经理,这是我想要的。但是,这段代码显然会像数据库中的汽车一样运行尽可能多的查询。

如何一次选择所有这些实例?

回答

0

这样的事情,也许(只编写了我的头顶部):

cars = Car.objects.filter(...) 
managers = {} 
for manager in Manager.objects.filter(manufacturer__car__in=cars): 
    manufacturers = managers.setdefault(manager.manufacturer_id, []) 
    manufacturers.append(manager) 
cars = list(cars) 
for car in cars: 
    car.managers = managers.get(car.manufacturer_id, []) 
+0

随着一些重大的调整,但我得到的概念,它工作得很好(只有2个查询)。谢谢。 – 2010-09-22 19:35:37