gpt4 book ai didi

Django - 使用 select_related() 优化查询

转载 作者:行者123 更新时间:2023-12-04 12:49:00 27 4
gpt4 key购买 nike

我有以下模型。

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')

最佳答案

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

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

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

当您执行 .values('owner__name') 时,Django 已经看到它需要加入 owners 和 cars,不会执行额外的查询。

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

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

关于Django - 使用 select_related() 优化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41572698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com