【问题标题】:A tough relationship with Django与 Django 的艰难关系
【发布时间】:2010-09-21 18:36:36
【问题描述】:

看看这个模型(这是假设的):

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)

会在字典中按经理列出制造商的汽车,这正是我想要的。但是,这段代码显然运行了与数据库中的汽车一样多的查询。

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

【问题讨论】:

    标签: django django-queryset django-select-related


    【解决方案1】:

    可能是这样的(只是我头脑中的代码):

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

    【讨论】:

    • 进行了一些重大调整,但我明白了这个概念,而且效果很好(只有 2 个查询)。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多