我想在django中做以下查询,理想情况下不使用迭代。我只想要数据库调用返回下面的查询表示的结果。不幸的是,根据the docs,这似乎不可能;只有Avg
,Max
和Min
等常规函数可用。目前我正在使用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的数据库,那么最好不要重写所有查询。
答案 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。