Obj.objects.get を 100 回ループすると、100 回の SQL クエリが実行されます。Obj.objects.filter は 1 つの SQL クエリで結果を返しますが、すべてのモデル フィールドも選択します。これを行う正しい方法は、単一のクエリでこれを行う Obj.objects.values_list を使用し、「値」フィールドのみを選択することです。
start_date = date(2009, 8, 20)
end_date = date(2009, 8, 23)
objects = Obj.objects.filter(date__range=(start_date,end_date))
# values_list and 'value' aren't related. 'value' should be whatever field you're querying
val_list = objects.values_list('value',flat=True)
# val_list = [10, 15, 8]
val_list の実行中の集計を行うには、これを行うことができます (これが最も Pythonic な方法であるかどうかはわかりません)。
for i in xrange(len(val_list)):
if i > 0:
val_list[i] = val_list[i] + val_list[i-1]
# val_list = [10,25,33]
編集:欠落した日を考慮する必要がある場合、@ Glenn Maynard の答えは実際にはかなり良いですが、私は dict() 構文を好みます:
objects = Obj.objects.filter(date__range=(start_date,end_date)).values('date','value')
val_dict = dict((obj['date'],obj['value']) for obj in objects)
# I'm stealing datetimeRange from @Glenn Maynard
val_list = [val_dict.get(day, 0) for day in datetimeRange(start_date, end_date)]
# val_list = [10,15,0,8]