重复,意外的Django Queryset评估

时间:2013-01-15 17:38:23

标签: python django

我在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>]                                                             

手动执行类似操作(无线程)会产生相同的结果。这意味着每次打印alerts时,它都会重新评估查询。我本来期待一次评估。

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

有人能否详细说明这是如何运作的?我知道Django documentation regarding when querysets are evaluated,但重复的查询评估仍让我感到惊讶。

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

随访:

在进一步调查中,打印以下内容会导致重复点击数据库:

  • alerts
  • alerts.exists()

以下不要:

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

0 个答案:

没有答案