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()
、この結果が期待できたでしょう。しかし、DB クエリを 1 回しか呼び出していないことを考えると、DB クエリを繰り返し適用することにうんざりしていましたall()
(MySQL ログを有効にしてチェックしたところ、印刷ごとに個別のクエリ エントリが見つかりました)。
誰かがこれがどのように機能しているのかを正確に明らかにできますか? クエリセットが評価されるタイミングに関するDjangoのドキュメントは知っていますが、クエリの評価が繰り返されることにはまだ驚きました。
これは、Ubuntu 10.04 上の Django 1.4 および Python 2.6 で発生します。
ファローアップ:
さらに調査すると、次のように出力すると、データベースへのヒットが繰り返されます。
alerts
alerts.exists()
.
以下は禁止です:
len(alerts)
bool(alerts)
[a for a in alerts]