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