在Django中使用mysql查询或等效查询

在Django中使用mysql查询或等效查询,django,django-queryset,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; 我基本上是试图以尽可能最有效的方式,按月计算平均值,并通过另一

您好,我有一个用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;
我基本上是试图以尽可能最有效的方式,按月计算平均值,并通过另一个查询,按年计算平均值。要平均的字段将是视图中的python变量,日期和分组方法也是如此

是否有本机Django解决方案,或者我是否需要使用.extra()执行某些操作(尽管我希望避免这样做,以免与mysql绑定)?我已经查看了
aggregate
的文档,但它们在这种情况下没有帮助

任何帮助都将不胜感激

您是否尝试过:

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字典,并将其传递给annotate函数

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

可能需要在
annotate
中指定名称。还有一个问题-如果我需要动态注释查询-如何实现?即,如果我不知道要提前查询哪些参数,我如何动态添加这些子句进行注释?
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)
                      )