Тяжелые отношения с Джанго - PullRequest
1 голос
/ 21 сентября 2010

Взгляните на эту модель (она гипотетическая):

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)

Перечислю в словаре автомобили производителя по менеджерам, чего я и хочу. Однако этот код, очевидно, выполняет столько же запросов, сколько машин в базе данных.

Как выбрать все эти экземпляры одновременно?

1 Ответ

0 голосов
/ 22 сентября 2010

Возможно, что-то вроде этого (просто код с моей головы):

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, [])
...