2012-08-31 104 views
0

我想在通用視圖中計算timedelta,但我不明白如何去通過元組並執行我正在查找的計算。Django視圖嵌套元組計算

我的計算機運行的查詢是

sla_list = self.object_list.filter(types__name="Unplanned").filter(service__sla=True).values_list('service__name', 'end_out', 'start_out') 

回報的一個例子是。

(u'Peoplesoft', datetime.datetime(2012, 7, 12, 1, 57, tzinfo=(UTC)), datetime.datetime(2012, 7, 11, 19, 25, tzinfo=(UTC))) 

我曾在一個模型法計算,它是工作但我想在timedelta我這樣做,雖然它應該被移動到視圖計算。

我使用該模型方法是

timedelta = self.end_out - self.start_out 
timedelta = timedelta.total_seconds() 
timedelta = time.strftime('%H:%M', time.gmtime(timedelta)) 

任何想法將是巨大的。謝謝。

+1

timedelta是日期時間模塊/對象的名稱,所以您應該使用不同的變量名稱。 – jcfollower

回答

0

sla_list包含您要求的3個值,因此sla_list[1]是end_out值,而start_outsla_list[2]

你的計算簡單地適用於這兩個值:

timedelta = sla_list[1] - sla_list[2] 
timedelta = '%02d:%02d' % divmod(timedelta.total_seconds(), 60) 

我換成你time.gmtime(timedelta)strftime舞蹈有更簡單的方法使用divmod() function;畢竟,你所需要做的就是把總秒數變成小時(秒除以60)和剩餘秒(模60)。

如果您需要按此項總結每service__name輸入,訂單的timedeltas並使用itertools.groupby callable快速,高效地計算你的資金:

from itertools import groupby 
from operator import itemgetter 

sla_list = self.object_list.filter(types__name="Unplanned").filter(service__sla=True).order_by('service__name').values_list('service__name', 'end_out', 'start_out') 
sla_deltas = {} 
for name, entries in groupby(sla_list, itemgetter(0)): 
    sla_deltas[name] = sum(end - start for name, end, start in entries) 

groupby功能爲您提供了匹配sla__name值子列表,我們只需計算每個條目的datetime.timedelta並使用sum()來計算總時間點。

+0

我得到了那部分,但我不知道如何在我的代碼中實現它。一旦我返回timedelta,我想查找所有相同的service_name並執行timedelte的總和。 – Ross

+0

@Ross:這遠遠不能從你的問題中清楚。在你的文章中,你問如何訪問元組中的日期時間對象,而不是如何組合匹配服務名稱的timedeltas。 –

+0

@Ross:我已經更新了我的答案,爲所有給定的'service__name'總和所有timedeltas。下一次,請在您的回答中明確說明您的期望:-) –