特定の日付のモデルからすべてのレコードを取得し、その結果を使用して追加のフィルタリングを実行するメソッドがあります。追加のフィルタリングは、1 時間ごとにレコードを取得するループです。
単純化された例 (例のいくつかの疑似コーディング)
qs = Occasion.filter(start_date__gte='2013-05-27 00:00:00', end_date__lte='2013-05-27 23:59:59')
list(qs)
for start_hour, end_hour in method_that_returns_hour_for_date('2013-05-27 00:00:00'):
# start_hour = 2013-05-27 00:00:00
# end_hour = 2013-05-27 01:00:00 and so on...
#The query below renders a new query
sub = qs.filter(start_date__lte=start_hour, end_date__gte=end_hour)
デバッグ ツールバーでは、ループ内の 1 時間ごとに新しい DB クエリが実行されていることがわかります。フィルター処理されていないクエリセットで len() と list() を実行して、ループの前に SQL クエリを実行しようとしましたが、ループ時に追加のクエリが実行されるのを防ぎません。
これを最適化するにはどうすればよいですか?