1

我在 Django 集成测试中有以下代码片段:

alerts = models.DroppedDom.objects.all()
print 123321, alerts
print 123321, alerts
print 123321, alerts
time.sleep(1)
print 123321, alerts

在一个单独的线程中,我对 DroppedDom 表进行了一次插入。

输出:

123321 []
123321 []
123321 []
123321 [<DroppedDom: DroppedDom object>]                                                             

手工做类似的事情(没有线程)会得到相同的结果。这意味着每次您 printalerts时,它都会重新评估查询。我会期待一个单一的评估。

如果我反复打印models.DroppedDom.objects.all(),我会预料到这个结果。但是我被数据库查询的重复应用吓到了,因为我只调用了all()一次(我启用并检查了 MySQL 日志,并为每次打印找到了一个单独的查询条目)。

有人可以确切说明这是如何工作的吗?我知道有关何时评估查询集的 Django 文档,但是重复的查询评估仍然让我感到惊讶。

这是 Ubuntu 10.04 上的 Django 1.4 和 Python 2.6。

跟进:

在进一步调查中,打印以下原因导致数据库重复命中:

  • alerts
  • alerts.exists().

以下不:

  • len(alerts)
  • bool(alerts)
  • [a for a in alerts]
4

0 回答 0