0

ジェネリックビューでタイムデルタを計算しようとしていますが、タプルを調べて探している計算を実行する方法がわかりません。

私が実行しているクエリは

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 = self.end_out - self.start_out
timedelta = timedelta.total_seconds()
timedelta = time.strftime('%H:%M', time.gmtime(timedelta))

どんなアイデアでも素晴らしいでしょう。ありがとう。

4

1 に答える 1

0

sla_list要求した3つの値が含まれているためsla_list[1]、end_out値も含まれますが、start_outはですsla_list[2]

これらの2つの値に計算を適用するだけです。

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

関数を使用して、あなたtime.gmtime(timedelta)strftimeダンスをより簡単な方法に置き換えました。結局のところ、あなたがする必要があるのは、秒の総数を時間(秒を60で割ったもの)と残りの秒(60を法とする秒)に変えることです。divmod()

エントリごとのタイムデルタを合計する必要がある場合は、service__nameそのエントリで並べ替え、itertools.groupby呼び出し可能オブジェクトを使用して合計をすばやく効率的に計算します。

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__namedatetime.timedeltasum()

于 2012-08-31T14:05:09.787 に答える