您好我有一个查询,在mysql中编写非常简单,但我很难转换为Django:
SELECT year, month, AVG(mean_air_temp), AVG(min_air_temp), AVG(max_air_temp) from climate WHERE recorded_on >= '1978-09-09' AND recorded_on <= '1988-09-09' GROUP by month;
我的数据如下:
+----+------+-------+-------------+---------------+--------------+--------------+----------+--------------+---------------+
| id | year | month | recorded_on | mean_air_temp | min_air_temp | max_air_temp | sea_temp | mean_rel_hum | precipitation |
+----+------+-------+-------------+---------------+--------------+--------------+----------+--------------+---------------+
| 1 | 1964 | 12 | 1964-12-31 | 26.1 | 22.2 | 30.8 | 25.8 | 82 | 0 |
| 2 | 1965 | 1 | 1965-01-01 | 23.9 | 21 | 25.8 | 22.7 | 84 | 0.7 |
| 3 | 1965 | 1 | 1965-01-02 | 23.4 | 21.1 | 26.2 | 22.4 | 83 | 0 |
我基本上是想按月以最有效的方式逐月获得平均值,并使用另一个查询。要平均的字段将是视图中的python变量,因为日期和按方法分组。
是否存在原生的Django解决方案或者我是否需要使用.extra()做一些事情(尽管我想避免这种情况,以至于我没有绑定到mysql)?我查看了aggregate
的文档,但他们在这种情况下没有帮助。
任何帮助都会非常值得赞赏。
答案 0 :(得分:1)
你试过了吗?
from django.db.models import Count
from django.db.models import Avg, Max, Min, Count
un_test_able = Climate.objects.filter(
recorded_on__gte='1978-09-09',
recorded_on__lte='1988-09-09')
.values('month')
.annotate(mean_air_temp=AVG('mean_air_temp'),
min_air_temp=AVG('min_air_temp'),
max_air_temp=AVG('max_air_temp')
)
动态版本,不确定您需要多少动态,但您可以构建一个关键字arg字典,但是您可以将其传递给注释函数。
1动态密钥的示例......
key_mean = 'mean_air_temp'
query_value_mean='mean_air_temp'
kwargs = {
key_mean:AVG(query_value_mean),
'min_air_temp':AVG('min_air_temp'),
'max_air_temp':AVG('max_air_temp')
}
un_test_able = Climate.objects.filter(
recorded_on__gte='1978-09-09',
recorded_on__lte='1988-09-09')
.values('month')
.annotate(**kwargs)
)