使用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文档中的“defer”,但是这样做不起作用(实际上它会进行更多的调用)。 “价值”是一种可能性,但在实际操作中,还有更多我想要提取的领域。我唯一想做的就是不评估FOREIGN KEY。我很乐意将person_id恢复原状。这大大减少了运行时间,特别是在我执行如下命令时:Address.objects.all(),因为Django会评估每个外键。
答案 0 :(得分:0)
刚刚在同一个问题上看到了你的另一个问题,我猜你已经定义了一个引用ForeignKey字段的__unicode__
方法。如果在shell中查询某些对象并输出它们,则会调用__unicode__
方法,这需要查询来获取ForeignKey。解决方案是重写该方法,使其不需要该引用,或者 - 正如我在另一个问题中所说的那样 - 使用select_related()
。
下次请提供完整的代码,包括一些实际证明您遇到问题的代码。