【问题标题】:Grouping Django model entries by day using its datetime field使用日期时间字段按天对 Django 模型条目进行分组
【发布时间】:2012-03-09 16:58:11
【问题描述】:

我正在使用类似文章的模型,该模型具有 DateTimeField(auto_now_add=True) 来捕获发布日期 (pub_date)。如下所示:

class Article(models.Model):
    text = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

我想做一个查询,计算每天添加了多少文章帖子或条目。换句话说,我想查询条目并按天(最终按月、小时、秒等)对它们进行分组。这在 SQLite shell 中类似于以下内容:

select pub_date, count(id) from "myapp_article"
where id = 1
group by strftime("%d", pub_date)
;

返回类似:

2012-03-07 18:08:57.456761|5
2012-03-08 18:08:57.456761|9
2012-03-09 18:08:57.456761|1

我似乎无法弄清楚如何从 Django QuerySet 中获取该结果。我知道如何获得a similar result using itertools.groupby,但在这种情况下这是不可能的(解释如下)。

此查询的最终结果将用于显示每天的帖子数量的图表。我正在尝试使用Django Chartit 包来实现这个目标。 Chartit 对数据源 (DataPool) 施加了约束。源必须是模型、管理器或查询集,因此据我所知,使用 itertools.groupby 不是一个选项。

所以问题是...... 我如何按天对条目进行分组或聚合并最终得到一个 QuerySet 对象?

【问题讨论】:

    标签: django django-models django-aggregation


    【解决方案1】:

    创建一个额外的字段,只存储日期数据(不是时间)并使用 Count 进行注释:

    Article.objects.extra({'published':"date(pub_date)"}).values('published').annotate(count=Count('id'))
    

    结果将是:

    published,count
    2012-03-07,5
    2012-03-08,9
    2012-03-09,1
    

    【讨论】:

    • 如果我们想在同一查询中获取除计数之外的所有条目怎么办?
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多