如何聚合计算字段与django ORM?(没有原始SQL)



我试图找到一些事件的累积持续时间,'开始'和'结束'字段都是django.db.models.DateTimeField字段。

我想做的事情应该这样写:

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.

我不能在python中分别聚合(Sum)开始和结束,然后减去,因为DB不能Sum DateTime对象。

没有原始sql的好方法?

在没有Delorean的情况下无法帮助Christophe,但是我遇到了这个错误,并且能够在Django 1.8中解决它,如:

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

当我无法将所有依赖项升级到1.8时,我发现这可以在MySQL之上的Django 1.7.9上工作:

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

如果你使用的是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'))))

这个答案还没有真正满足我,我目前的工作工作,但它不是DB计算…

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

以秒为单位返回查询集中所有事件的持续时间

更好的SQL少的解决方案?

相关内容

  • 没有找到相关文章

最新更新