Python 通过object.fk.id和object.fk_id查找外键的差异

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

我觉得这个问题不是这样的

在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()
哪一个更快,还是相同

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
的查找,因为这只是一列(存储在数据库中的列)。