Django - 使用 select_related() 优化查询

Django - Optimize queries with select_related()

我有以下型号。

class Car(models.Model):
    owner = models.ForeignKey('Driver')

class Country(models.Model)
    name = models.CharField(max_length=255)

class Driver(models.Model):
    name = models.CharField(max_length=255)
    age = models.IntegerField()
    country = models.ForeignKey('Country')

我想select拥有汽车的司机的姓名。

Car.objects.all().values('owner__name')

我是否需要使用 select_related() 方法来避免每个 object 的连接,或者它是多余的,因为它隐含了 values() 方法?

Car.objects.all().select_related('owner').values('owner__name')

同样,这次我要的是有车司机的国家名称。哪一个最好?

Car.objects.all().values('owner__country__name')
Car.objects.all().select_related('owner', 'country').values('owner__country__name')
Car.objects.all().select_related('owner__country').values('owner__country__name')

首先,你的例子中所有出现的.all()都可以删除;管理器 (.objects) 几乎已经拥有 QuerySet 的所有方法,除了 .delete().

.select_related 仅在您最终查询时有用 returns 模型实例;然后,将预加载每个实例的所有外键。

但是,如果您使用 .values,您将获得字典,并且没有要预加载的外键属性。所以在那种情况下不应该使用它。

当你这样做时 .values('owner__name') Django 已经看到它需要加入车主和汽车,不需要额外的查询。

在最后一个你想要国家,所以使用 Country.objects:

Country.objects.filter(driver__car__isnull=False).values('name')