我有一个像这样的 Django 模型:
class EVENT(models.Model):
user = models.CharField(max_length=255)
pay_time = models.DateTimeField(default=timezone.now)
我需要计算特定用户组每月的平均记录数。我的用户名位于列表中,我想按月份和年份进行分组以用于平均计算。我的查询是这样的:
from django.db import models
from django.db.models import Func, F, Count
class Month(Func):
function = 'EXTRACT'
template = '%(function)s(MONTH from %(expressions)s)'
output_field = models.IntegerField()
class Year(Func):
function = 'EXTRACT'
template = '%(function)s(YEAR from %(expressions)s)'
output_field = models.IntegerField()
#ru is the list of usernames I want to get the average per month for
trx = EVENT.objects.filter(user__in=ru).annotate(m=Month('pay_time'), y=Year('pay_time')).values('m', 'y').annotate(c=Count('id'))
当我运行这个查询时,我得到了我想要的结果。这是我得到的示例:
<QuerySet [{'y': 2016, 'c': 61098, 'm': 4}, {'y': 2016, 'c': 104632, 'm': 5}]>
我想确定一下,所以我运行了这个查询:
trx2 = EVENT.objects.filter(user__in=ru, pay_time__year=2016, pay_time__month=4)
我得到了结果 60990 条记录。
这意味着我从第一个查询得到的结果是不正确的。我知道我可以在循环中使用第二个查询来获取我想要的内容,但这与使用 GROUP BY 运行一个查询相比会非常慢。
谢谢
编辑:
以下是 print trx.query
的输出:
SELECT
EXTRACT(YEAR from `events_event`.`pay_time`) AS `y`,
EXTRACT(MONTH from `events_event`.`pay_time`) AS `m`,
COUNT(`events_event`.`id`) AS `c`
FROM `events_event`
WHERE
`events_event`.`user` IN ('user1', 'user2')
GROUP BY
EXTRACT(YEAR from `events_event`.`pay_time`),
EXTRACT(MONTH from `events_event`.`pay_time`)
ORDER BY NULL
这是 print trx2.query
的输出:
SELECT
`events_event`.`id`,
`events_event`.`user`,
`events_event`.`pay_time`,
FROM `events_event`
WHERE
(`events_event`.`user` IN ('user1', 'user2')
AND `events_event`.`pay_time` BETWEEN 2015-12-31 22:00:00 AND 2016-12-31 21:59:59.999999
AND EXTRACT(MONTH FROM CONVERT_TZ(`events_event`.`pay_time`, 'UTC', Africa/Cairo)) = 4)
最佳答案
我认为解决方案在这里,在CONVERT_TZ
EXTRACT(MONTH FROM CONVERT_TZ(`events_event`.`pay_time`, 'UTC', Africa/Cairo))
你可以试试
class Month(Func):
function = 'EXTRACT'
template = "%(function)s(MONTH from CONVERT_TZ(%(expressions)s, 'UTC', 'Africa/Cairo'))"
output_field = models.IntegerField()
关于python - Django 按月和年分组查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46140771/