【问题标题】:Django count persons by month and yearDjango按月和年统计人数
【发布时间】:2021-01-16 06:37:20
【问题描述】:

我已经调试了一段时间,但我无法得到正确的结果。 在我的 django 应用程序中,我扩展了 auth_user 以添加更多字段:

from django.contrib.auth.models import User
class Person(User):
    api_id = models.CharField(max_length=255)
    api_key = models.CharField(max_length=255)

现在,我想根据加入日期按年和月统计用户数:

Person.objects.annotate(year=TruncYear("date_joined"), month=TruncMonth("date_joined")).values("year", "month").annotate(count=Count("pk"))

但是,我得到的只是数据库中每个用户的 count=1,而没有按年和月对他们进行分组。

这是正在执行的实际查询:

SELECT CAST(DATE_FORMAT(CONVERT_TZ(`auth_user`.`date_joined`, 'UTC', 'Europe/Madrid'), '%Y-01-01 00:00:00') AS DATETIME) AS `year`, CAST(DATE_FORMAT(CONVERT_TZ(`auth_user`.`date_joined`, 'UTC', 'Europe/Madrid'), '%Y-%m-01 00:00:00') AS DATETIME) AS `month`, COUNT(`mt_api_app_person`.`user_ptr_id`) AS `count` FROM `mt_api_app_person` INNER JOIN `auth_user` ON (`mt_api_app_person`.`user_ptr_id` = `auth_user`.`id`) GROUP BY CAST(DATE_FORMAT(CONVERT_TZ(`auth_user`.`date_joined`, 'UTC', 'Europe/Madrid'), '%Y-01-01 00:00:00') AS DATETIME), CAST(DATE_FORMAT(CONVERT_TZ(`auth_user`.`date_joined`, 'UTC', 'Europe/Madrid'), '%Y-%m-01 00:00:00') AS DATETIME), `auth_user`.`date_joined` ORDER BY `auth_user`.`date_joined` DESC

所有 count=1 似乎都是因为 GROUP BY [...] 'auth_user'.'date_joined' 按整个日期时间而不是月份和年份对条目进行分组。

这里发生了什么的任何线索?如果我执行相同的查询,但使用用户,我会得到我想要的。

SELECT CAST(DATE_FORMAT(CONVERT_TZ(`auth_user`.`date_joined`, 'UTC', 'Europe/Madrid'), '%Y-%m-01 00:00:00') AS DATETIME) AS `month`, COUNT(`auth_user`.`id`) AS `count` FROM `auth_user` GROUP BY CAST(DATE_FORMAT(CONVERT_TZ(`auth_user`.`date_joined`, 'UTC', 'Europe/Madrid'), '%Y-%m-01 00:00:00') AS DATETIME) ORDER BY NULL

【问题讨论】:

    标签: python mysql django datetime


    【解决方案1】:

    使用TruncMonth and TruncYear

    from django.db.models import Count
    from django.db.models.functions import TruncMonth, TruncYear
    
    Person.objects.annotate(month=TruncMonth('date_joined')).values('month').annotate(total=Count('pk'))
    Person.objects.annotate(year=TruncYear('date_joined')).values('year').annotate(total=Count('pk'))
    

    【讨论】:

    • 它不工作。它为每个用户返回 count=1,而不是按月和年分组并返回计数,例如 count=251
    【解决方案2】:

    您的查询似乎有错字。您使用 TruncYear 表示月份和年份,这就是为什么您只获得一个值,那就是年份。

    月份:

    Person.objects.annotate(month=TruncMonth("date_joined")).values("month").annotate(count=Count("pk"))
    

    年份:

    Person.objects.annotate(year=TruncYear("date_joined")).values("year").annotate(count=Count("pk"))
    

    【讨论】:

    • 你是对的,我在这里复制查询时打错了。但我在 Django 上做得正确。我纠正了我的问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多