2010-09-21 49 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