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')
我有以下型号。
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')