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

MoR*_*oRe 4 python django performance

我还没有在SO上找到这个问题。

在 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()
Run Code Online (Sandbox Code Playgroud)

哪个更快或者它们相同?

b.a_id
b.a.id
Run Code Online (Sandbox Code Playgroud)

编辑:实际上我想我可以自己回答这个问题......第二个变体应该更慢,因为它从数据库创建整个对象,对吧?

AKX*_*AKX 5

简单地说:是的,有一定的区别,并且b.a_id比 更快b.a.id

后者a从数据库中检索整个对象作为附加查询。(您可以通过添加 来保存该查询.select_related('a'),但仍然不需要执行.a.id替代操作。).a_id