在Django中使用mysql查询或等效

时间:2012-04-02 21:04:16

标签: django django-queryset

您好我有一个查询,在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的文档,但他们在这种情况下没有帮助。

任何帮助都会非常值得赞赏。

1 个答案:

答案 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)
                      )