2011-07-12 17 views
5

私はいくつかのイベントの累積期間を見つけようとしています。 '開始'と '終了'フィールドは両方ともdjango.db.models.DateTimeFieldフィールドです。計算されたフィールドをdjango ORMで集計する方法は? (未処理SQLなし)

from django.db.models import F, Sum 
from my.models import Event 
Event.objects.aggregate(anything=Sum(F('start') - F('end'))) 
# this first example return: 
# AttributeError: 'ExpressionNode' object has no attribute 'split' 

# Ok I'll try more SQLish: 
Event.objects.extra(select={ 
         'extra_field': 'start - end' 
        }).aggregate(Sum('extra_field')) 
# this time: 
# FieldError: Cannot resolve keyword 'extra_field' into field. 

私が起動し、DBは合計DateTimeオブジェクトことができないので、pythonでsubstractその後、個別に終了(和)agreggateすることはできません。私は何をしたいのは、このように書かれているはず

raw SQLを使用しないで良い方法はありますか?それは

秒でクエリセット内のすべてのイベントの継続時間を返し

答えて

0

この答えは本当に、まだ私を満たしていない私の現在の仕事は、周りに動作しますが、それは計算からDBではないです...

reduce(lambda h, e: h + (e.end - e.start).total_seconds(), events, 0) 

より良いSQL lessソリューション?

1

はデロリアンなしクリストフを助けることはできませんが、私はこのエラーを打つなどジャンゴ1.8でそれを解決することができた。私は1.8にすべての私の依存関係をアップグレードすることができなかった場合は

total_sum = Event.objects\ 
    .annotate(anything=Sum(F('start') - F('end')))\ 
    .aggregate(total_sum=Sum('anything'))['total_sum'] 

、Iこれは、MySQLの上でDjangoの1.7.9で動作することが分かっ:あなたはPostgresの上にある場合、あなたはdjango-pg-utilsパッケージを使用してデータベースに計算することができ

totals = self.object_list.extra(Event.objects.extra(select={ 
    'extra_field': 'sum(start - end)' 
})[0] 
+1

あなたのDeloreanはうまく動作しているようです。しかし、実際には私のプロジェクトがまだ残っていれば、私は合計金額(日曜、祝日、夜間、昼間など...) – christophe31

1

。継続時間フィールドを秒にキャストしてから合計を取る

from pg_utils import Seconds 
from django.db.models import Sum 

Event.objects.aggregate(anything=Sum(Seconds(F('start') - F('end')))) 
関連する問題