Django - 使用select_related()优化查询

时间:2017-01-10 15:43:49

标签: django django-queryset django-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')

我想选择拥有汽车的司机的名字。

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

我是否需要使用select_related()方法来避免每个对象的连接,或者它是多余的,因为隐含了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')

1 个答案:

答案 0 :(得分:2)

首先,可以删除示例中.all()的所有匹配项;经理(.objects)已经拥有QuerySet的几乎所有方法,.delete()除外。

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

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

当你做.values('owner__name') Django已经发现它需要加入所有者和汽车时,不会进行额外的查询。

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

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