2013-06-01 234 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看到我更新的答案,並讓我知道如果你想要什麼 –