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推迟外键查找的主要内容,如果未能解决你的问题,请参考以下文章