3

我有以下模型。

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

1 回答 1

5

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

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

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

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

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

Country.objects.filter(driver__car__isnull=False).values('name')
于 2017-01-10T15:56:44.640 回答