Django推迟外键查找

Posted

技术标签:

【中文标题】Django推迟外键查找【英文标题】:Django defering the foreign key look up 【发布时间】:2013-03-18 20:33:25 【问题描述】:

从事 django 项目并尝试加快调用速度。我注意到 Django 自动执行第二个查询来评估任何外键关系。例如,如果我的模型看起来像:

Model Person:
    name = model.CharField("blah")

Model Address:
    person = model.ForeignKey(Person)

然后我做:

p1 = Person("Bob")
address1 = Address(p1)
print (p1.id) #let it be 1 cause it is the first entry

然后当我打电话时:

address1.objects.filter(person_id = "1")

我明白了:

查询 #1:SELECT address.id, address.person_id FROM address

查询 #2:SELECT person.id, person.name FROM person

我想摆脱第二个电话,查询#2。我曾尝试使用 django 文档中的“延迟”,但这不起作用(实际上它会进行更多调用)。 “价值观”是一种可能性,但在实际实践中,我想提取更多领域。我唯一想做的就是不评估外键。我很乐意取回 person_id,或者不取回。这大大减少了运行时间,尤其是当我执行如下命令时:Address.objects.all(),因为 Django 会评估每个外键。

【问题讨论】:

【参考方案1】:

刚刚看到您在同一问题上的其他问题,我猜您已经定义了一个引用 ForeignKey 字段的__unicode__ 方法。如果在shell中查询一些对象并输出,会调用__unicode__方法,这需要查询获取ForeignKey。解决方案是重写该方法,使其不需要该引用,或者 - 正如我在另一个问题中所说 - 使用 select_related()

下次,请提供完整的代码,包括一些实际演示您遇到的问题的代码。

【讨论】:

我发现我的 unicode 确实引用了 self.house.id。这似乎解决了问题!谢谢。由于声誉不足,我无法投票,但可以投票的人应该投票!

以上是关于Django推迟外键查找的主要内容,如果未能解决你的问题,请参考以下文章

Django 反向查找外键

如何查找对实例的所有 Django 外键引用

Django外键反向查找

带有查找字段的嵌套模型外键上的 Django JOIN

django中数据查找条件是表中的外键对应表的列该如何查找?

Django 查询集外键