2012-08-31 61 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。下一次,请在您的回答中明确说明您的期望:-) –