Python 通过object.fk.id和object.fk_id查找外键的差异
我觉得这个问题不是这样的 在django的对象模型中执行外键查找的以下两种变体之间是否存在速度差异?我只需要外键Python 通过object.fk.id和object.fk_id查找外键的差异,python,django,performance,Python,Django,Performance,我觉得这个问题不是这样的 在django的对象模型中执行外键查找的以下两种变体之间是否存在速度差异?我只需要外键 class A(models.Model): x = models.PositiveIntegerField(null=True) class B(models.Model): a = models.ForeignKey(A, null=True, on_delete=models.CASCADE) y = models.PositiveIntegerFie
class A(models.Model):
x = models.PositiveIntegerField(null=True)
class B(models.Model):
a = models.ForeignKey(A, null=True, on_delete=models.CASCADE)
y = models.PositiveIntegerField(null=True)
b = b.objects.last()
哪一个更快,还是相同
b.a_id
b.a.id
编辑:事实上我想我可以自己回答。。。第二个变量应该较慢,因为它从db创建整个对象,对吗?简单地说:是的,有一个明确的区别,
b.a\u id
比b.a.id
快
后者从数据库中检索整个对象作为附加查询。
(您可以通过添加来保存该查询。选择\u related('a')
,但执行。a.id
而不是。a\u id
仍然是不必要的。)
在django的对象模型中执行外键查找的以下两种变体之间是否存在速度差异?我只需要外键
class A(models.Model):
x = models.PositiveIntegerField(null=True)
class B(models.Model):
a = models.ForeignKey(A, null=True, on_delete=models.CASCADE)
y = models.PositiveIntegerField(null=True)
b = b.objects.last()
是,fk_id
存储在数据库中。默认情况下(即如果您不以某种方式.defer(..)
该字段),则在查询物化时加载该字段(例如加载对象)
.fk_id
这不需要额外的查询。而.fk
是,除非您通过加载它。选择与\u相关的(..)
或。预取与\u相关的(..)
,将需要额外的查询。关系(如外键关系)是延迟加载的:如果查询self.fk.id
,则首先获取.fk
,产生一个额外的查询,然后从该对象获取.id
(不需要额外的查询)。没有对fk\u id
的查找,因为这只是一列(存储在数据库中的列)。