如果您循環訪問100次Obj.objects.get,則會執行100次SQL查詢。 Obj.objects.filter將在一個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的運行聚合,你可以做到這一點(不能確定這是最Python的方式)
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]
數據庫?什麼數據庫?直到我們完成並在標籤中看到您使用的是Django(因此推測是它的內置ORM - 如果您使用的是另一種,您應該指定!),但這個問題非常混亂;未來,請將這些信息放在主題中或其他前面。我在這裏做了適當的編輯。 – 2009-09-03 03:51:49
woops,對不起。是的,我正在使用django ORM,我也在使用Postgres – priestc 2009-09-03 04:46:04
我們可以假設每個日期只有一個或零個對象嗎? – Wogan 2009-09-03 09:05:37