2011-07-12 60 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. 

我不能agreggate(SUM)開始,分別終止然後在。減去蟒蛇因爲DB不能總datetime對象。

一個沒有原始sql的好方法嗎?

回答

0

這個答案並不真的滿足我呢,我目前的工作圍繞的作品,但它不是分貝計算...

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

它返回的所有事件的持續時間在查詢集以秒

更好的SQL解決方案?

1

不禁克里斯托夫沒有德羅寧,但我打這個錯誤,並能解決它在Django 1.8,如:

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

當我不能我所有的依賴關係升級到1.8,我發現這與Django的1.7.9關於MySQL的頂部工作:

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

您的Delorean似乎很好地運行;-)。但事實上,如果我的項目仍然存在,那麼我無法再構建SQL中的總和,因爲我彌補了數量巨大的數額(星期日,星期日,夜晚,白天......) – christophe31

1

如果你是Postgres的,那麼你可以使用django-pg-utils包和數據庫計算。將持續時間字段轉換爲秒數,然後取得總和

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

Event.objects.aggregate(anything=Sum(Seconds(F('start') - F('end'))))