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