在 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 等效项?
angular.js 中的 Django formset 等效项