Django推迟了外键查找

时间:2013-03-18 20:33:26

标签: python database django query-optimization

使用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 addressidaddress.person_id FROM address

查询#2:SELECT personidperson.name FROM person

我想摆脱第二次通话,查询#2。我尝试过使用django文档中的“defer”,但是这样做不起作用(实际上它会进行更多的调用)。 “价值”是一种可能性,但在实际操作中,还有更多我想要提取的领域。我唯一想做的就是不评估FOREIGN KEY。我很乐意将person_id恢复原状。这大大减少了运行时间,特别是在我执行如下命令时:Address.objects.all(),因为Django会评估每个外键。

1 个答案:

答案 0 :(得分:0)

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

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