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

Posted

技术标签:

【中文标题】在 Django 中使用 mysql 查询或等效项【英文标题】:Using mysql query or equivalent in Django 【发布时间】:2012-04-02 21:04:16 【问题描述】:

您好,我有一个查询,在 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】:

你试过了吗:

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中指定名称。 还有一个问题——如果我需要动态注释查询——我该如何实现?也就是说,如果我不知道要提前查询哪些参数,我该如何添加这些要即时注释的子句?

以上是关于在 Django 中使用 mysql 查询或等效项的主要内容,如果未能解决你的问题,请参考以下文章

Django Average 和 Group By 中的 MYSQL 等效查询

在 WHERE 子句中使用函数编写 SQL SELECT 语句是不是有 Django 等效项?

MySQL 限制的 SQL Server 等效项 [重复]

angular.js 中的 Django formset 等效项

JPQL 中的 timestampdiff 等效项(不使用标准)

MySQL ONLY IN() 等效子句