如何在django的sql查询中进行常规数学运算?

时间:2015-07-10 16:40:19

标签: python mysql django

我想在django中做以下查询,理想情况下不使用迭代。我只想要数据库调用返回下面的查询表示的结果。不幸的是,根据the docs,这似乎不可能;只有AvgMaxMin等常规函数可用。目前我正在使用django 1.4,但我很乐意从django 1.8重写内容(因此文档页面;我已经听说1.8很多这些东西比1.4好得多)

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的数据库,那么最好不要重写所有查询。

2 个答案:

答案 0 :(得分: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']

如果使用的数据类型不同,则需要指定输出字段。

答案 1 :(得分:0)

您可以直接使用SQL表达式在Django中执行该查询。检查the docs concerning performing raw SQL queries