2015-07-10 26 views
3

以下查詢我很樂意在django中完成,理想情況下不使用迭代。我只是希望數據庫調用返回下面查詢所表示的結果。不幸的是根據the docs這似乎不可能;只有像Avg,MaxMin等一般功能可用。目前我使用Django 1.4,但我很高興地從Django的1.8重寫的東西(因此文檔頁面;我聽說1.8做了很多這些東西比1.4好得多)如何在django的sql查詢中做一般的數學運算?

select sum(c.attr1 * fs.attr2)/ sum(c.attr1) from fancyStatistics as fs 
left join superData s on fs.super_id=s.id 
left join crazyData c on s.crazy_id=c.id; 

注:

直接在django中做這件事的主要原因是,如果我們想將我們的數據庫從MySQL更改爲更適合django的東西,最好不要重寫所有查詢。

回答

1

您應該能夠使用F表達式獲得聚合,以便在不放入SQL的情況下執行大部分所需的操作。

https://docs.djangoproject.com/en/1.8/topics/db/aggregation/#joins-and-aggregates

aggregate_dict = FancyStatistics.objects.all()\ 
    .aggregate( 
     sum1=Sum(
      F('superdata__crazydata__attr1') * F('attr2'), output_field=FloatField() 
     ) , 
     sum2=Sum('superdata__crazydata__attr1') 
    ) 
) 
result = aggregate_dict['sum1']/aggregate_dict['sum2'] 

你需要的,如果使用的數據類型是不同的指定輸出領域。