是否可以在不使用select方法的情况下在Django中重现以下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;
Run Code Online (Sandbox Code Playgroud)
为了得到这样的结果:
+---------------------+-----------+
| 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)
Run Code Online (Sandbox Code Playgroud)
编辑:我现在得到这种查询:
>>> 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
Run Code Online (Sandbox Code Playgroud)
为什么sum对日期时间和数据都进行操作?
我尝试了django doc上的所有地方,这里是堆栈,但没有找到与我的问题一致的东西.有什么建议吗?
嗯,你正在使用Count,你应该使用Sum,values()并将确定所发生的事情,GROUP BY所以你应该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'))
Run Code Online (Sandbox Code Playgroud)
虽然我不太确定filter()它的顺序,所以它可能是这样的:
values = self.model.objects.values('datetime').annotate(data_sum=Sum('data')).filter(
datetime__range=(self.dates[0], self.dates[1])
)
Run Code Online (Sandbox Code Playgroud)
我想你会想尝试两个.如果要查看这些查询集的原始查询,请使用Queryset.query:
print self.model.objects.filter(
datetime__range=(self.dates[0], self.dates[1])
).values('datetime').annotate(data_sum=Sum('data')).query.__str__()
Run Code Online (Sandbox Code Playgroud)
因此,您可以确保获得正确的查询.
希望能帮助到你.
order_by()会给你GROUP BY:
values = self.model.objects.filter(datetime__range=(
self.dates[0], self.dates[1])) \
.values('datetime') \
.annotate(data_sum=Sum('datas') \
.order_by())
Run Code Online (Sandbox Code Playgroud)