2013-06-01 199 views
0
的总和

我的模型:汇总查询和结果

class MyModel(models.Model) 
    a = models.PositiveIntegerField(default=0) 
    b = models.PositiveIntegerField(default=0) 
    c = models.PositiveIntegerField(default=0) 
    d = models.PositiveIntegerField(default=0) 

我想计算SUM在每个领域,还包括进入设置使用聚合的结果的表达式查询:

MyModel.objects.aggregate(a_s=Sum('a'), 
          b_s=Sum('b'), 
          c_s=Sum('c'), 
          d_s=Sum('d')).extra(select={'diff': 'a_s+b_s-c_s-d_s'}) 

我得到这个错误:

'dict' object has no attribute 'extra' 

这是应该如何使用ORM?

+0

聚合返回字典。在获取查询集后,你能否处理差异? – karthikr

+0

我当然可以在获取它之后处理查询集,我只是试图在一个语句中完成它。我尝试使用'annotate'而不是'aggregate',它返回一个查询集,但仍然不知道如何去做。 – akonsu

回答

0

试试这个:

qs = MyModel.objects.all().extra(select={'diff': 'SUM(a + b) - SUM(c + d)'}) 
for obj in qs: 
    print obj.diff 

编辑

result_dict = MyModel.objects.extra(
    select={ 
     'diff': 'SUM(a) + SUM(b) - SUM(c) - SUM(d)', 
     'a_s': 'SUM(a)', 
     'b_s': 'SUM(b)', 
     'c_s': 'SUM(c)', 
     'd_s': 'SUM(d)' 
    }).values('diff', 'a_s', 'b_s', 'c_s', 'd_s') 

这将返回一个dict这将对各个字段的表达a + b - c - d和总和的结果。

+0

@akonsu但是这会给总体'diff'。也许你想按某种东西分组? –

+0

谢谢。我不需要分组,我需要总体SUM,但是我需要分别求和每个字段,并在同一个查询集合中使用表达式'a + b - c - d'的总和。 – akonsu

+0

@akonsu看到我更新的答案,并让我知道如果你想要什么 –