我有以下型号。
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')
答案 0 :(得分:2)
首先,可以删除示例中.all()
的所有匹配项;经理(.objects
)已经拥有QuerySet的几乎所有方法,.delete()
除外。
.select_related
仅在您的最终查询返回模型实例时有用;然后,每个实例的所有外键都将被预加载。
但是如果您使用的是.values
,那么您将获得字典,并且没有预先加载的外键属性。所以在这种情况下不应该使用它。
当你做.values('owner__name')
Django已经发现它需要加入所有者和汽车时,不会进行额外的查询。
在最后一个你想要国家,所以使用Country.objects:
Country.objects.filter(driver__car__isnull=False).values('name')