Django查看嵌套元组计算

时间:2012-08-31 13:54:41

标签: python django

我正在尝试计算通用视图中的timedelta,但我不明白如何通过元组进行并进行我正在寻找的计算。

我正在运行的查询是

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上进行计算,但我应该将其移动到View中。

我使用的模型方法是

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

任何想法都会很棒。感谢。

1 个答案:

答案 0 :(得分: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)

我使用divmod() function更简单的方法替换了您的time.gmtime(timedelta)strftime舞蹈;所有你需要做的就是将总秒数转换为小时(秒除以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()计算总时间值。< / p>