python - Django 按月和年分组查询

标签 python mysql django

我有一个像这样的 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/

相关文章:

php - 从注册表中的电子邮件域中提取大学名称

python - 如何删除引用某个对象的所有嵌套对象?

python - 除非明确要求,否则禁用某些测试的自动测试执行

python - 模拟满足协方差矩阵的时间序列

mysql - SQL查询连接数据库中的字符串

python - 从 Django 查询中获取非唯一值

python - 从 Django 单元测试中获取通过或失败的输出

python - 为什么 Anaconda 不识别 conda 命令?

Python 正则表达式在文件行首搜索字符串

Mysqldump 特定的存储过程/函数,但不是其他的