2009-12-09 66 views
7

我需要获得两列的聚合值。所以首先将它们重复在一起,然后获得他们的sum()。下面的代码自然不起作用,只是为了澄清。Django:获取两个相乘列的聚合值

是不是有可能或者我应该使用原始SQL?

SomeModel.objects 
    .filter(**something) 
    .aggregate(Sum('one_column' * 'another_col')) 

回答

10

你并不需要那么多的原始SQL使用extra()

obj = SomeModel.objects.filter(**something).extra(
    select = {'total': 'SUM(one_column * another_column)'}, 
) 
1

这是sparta。这样一来,如果你想在模板中的某个地方打印出来,你必须使用这样的事情:

{{ queryset.0.total }} 

这是正确的在这里找到答案:Django Aggregation: Summation of Multiplication of two fields

形式为:

agg = Task.objects.all().aggregate(total=Sum('field1', field="field1*field2")) 
1

正如我在这里回答的https://stackoverflow.com/a/36024089/4614802 正确的解决方案取决于django版本。

  • 对于django的< 1.8使用.aggregate(Sum('field1', field="field1*field2"))
  • 适用于Django> = 1.8使用.aggregate(Sum(F('field1')*F('field2'))