【问题标题】:Django defering the foreign key look upDjango推迟外键查找
【发布时间】: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 会评估每个外键。

【问题讨论】:

    标签: python database django query-optimization


    【解决方案1】:

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

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

    【讨论】:

    • 我发现我的 unicode 确实引用了 self.house.id。这似乎解决了问题!谢谢。由于声誉不足,我无法投票,但可以投票的人应该投票!
    猜你喜欢
    • 2013-02-24
    • 2013-10-18
    • 2018-10-16
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2018-09-01
    相关资源
    最近更新 更多