Mysql Django分组(按日期和总值)

Mysql Django分组(按日期和总值),mysql,django,Mysql,Django,在Django中不使用select方法是否可以重现以下mysql查询 MariaDB [db1]> SELECT datetime, SUM(datas) FROM table AND datetime BETWEEN '2013-07-26 13:00:00' AND '2013-07-26 23:00:00' GROUP BY datetime; 要获得这种结果: +---------------------+-----------+ | datetime |

在Django中不使用select方法是否可以重现以下mysql查询

MariaDB [db1]> SELECT datetime, SUM(datas) FROM table AND datetime BETWEEN '2013-07-26 13:00:00' AND '2013-07-26 23:00:00' GROUP BY datetime;
要获得这种结果:

+---------------------+-----------+
| datetime            | SUM(data) |
+---------------------+-----------+
| 2013-07-26 13:00:00 |       489 |
| 2013-07-26 14:00:00 |      2923 |
| 2013-07-26 15:00:00 |       984 |
| 2013-07-26 16:00:00 |      2795 |
| 2013-07-26 17:00:00 |      1308 |
| 2013-07-26 18:00:00 |      1365 |
| 2013-07-26 19:00:00 |      1331 |
| 2013-07-26 20:00:00 |       914 |
| 2013-07-26 21:00:00 |       919 |
| 2013-07-26 22:00:00 |       722 |
| 2013-07-26 23:00:00 |       731 |
+---------------------+-----------+
11 rows in set (1.45 sec)
编辑:我现在得到了这种查询:

>>> value = table.objects.filter(datetime__range=('2013-07-26 13:00:00', 
 '2013-07-26 23:00:00')).values('datetime', 'data').annotate(Sum('data'))

>>> print value.query
SELECT `table`.`datetime`, `table`.`data` SUM(`table`.`imps`) AS `data__sum`
 FROM `table`
WHERE `table`.`datetime` BETWEEN 2013-07-26 13:00:00
and 2013-07-26 23:00:00 GROUP BY `table`.`datetime`,
`table`.`data` ORDER BY NULL
为什么sum同时对datetime和data进行操作

我试着在django doc上的任何地方,在stack上,但没有找到与我的问题相关的东西。
有什么建议吗?

Hmm您使用的是
Count
,您应该使用
Sum
,而
values()
将根据
确定进入
组的内容,因此您应该只使用
值('datetime')
。您的查询集应该如下所示:

from django.db.models import Sum

values = self.model.objects.filter(
    datetime__range=(self.dates[0], self.dates[1])
).values('datetime').annotate(data_sum=Sum('data'))
虽然我不太确定
过滤器()的顺序,但可能是这样的:

values = self.model.objects.values('datetime').annotate(data_sum=Sum('data')).filter(
    datetime__range=(self.dates[0], self.dates[1])
)
我想你应该两个都试试。如果要查看这些查询集的原始查询,请使用
queryset.query

print self.model.objects.filter(
    datetime__range=(self.dates[0], self.dates[1])
).values('datetime').annotate(data_sum=Sum('data')).query.__str__()
因此,您可以确保得到正确的查询

希望有帮助。

order\u by()
将为您提供
分组依据

values = self.model.objects.filter(datetime__range=(
    self.dates[0], self.dates[1])) \
    .values('datetime') \
    .annotate(data_sum=Sum('datas') \
    .order_by())

您的查询集生成什么SQL?您可以使用
打印值。查询
切换
.annotate()
.values()
的顺序。值()
不起作用,抱歉:选择
日期时间
table
data
FROM
table
WHERE
table
datetime
从2013-07-26 13:00:00到2013-07-26 23:00:00:00)按
table
datetime
ASCIt没问题,我使用Hieu-Nguyen方法,问题来自值('datetime',data')空的
对我来说至关重要。如果我没有这样做,它就不能正确分组。如果我需要返回结果中的更多字段怎么办?thx,为什么在注释后进行筛选?只是我不确定它们的结果查询,所以可以使用
query.\uu str\uuu()
来检查您需要的查询。还要仔细检查我的答案,你应该只使用
值('datetime')
你可以编辑答案来指出哪个答案是正确的吗?我还需要添加一个空的
.order_by()
来让这个查询对我起作用。这将返回不按日期分组的结果,结果中会有重复的日期和不同