django聚合多天

Posted

技术标签:

【中文标题】django聚合多天【英文标题】:django aggregate for multiple days 【发布时间】:2015-11-01 03:45:48 【问题描述】:

我有一个模型,它有两个属性:日期和长度以及其他不相关的属性。而且我需要在模板中显示每天的长度总和列表。

到目前为止,我使用的解决方案是每天循环并使用如下聚合创建总和列表:

for day in month:
    sums.append(MyModel.objects.filter(date=date).aggregate(Sum('length')))

但由于数据库查找的数量,这对我来说似乎非常无效。难道没有更好的方法来做到这一点吗?喜欢缓存所有内容,然后在不接触数据库的情况下对其进行过滤?

【问题讨论】:

【参考方案1】:

.values() 可用于按date 分组,因此您只能通过.annotate() 获得唯一 日期以及length 字段的总和:

>>> from django.db.models import Sum
>>> MyModel.objects.values('date').annotate(total_length=Sum('length'))

来自docs:

.values() 子句用于约束结果集中返回的列时,评估注解的方法略有不同。不是为原始 QuerySet 中的每个结果返回带注释的结果,而是根据 .values() 子句中指定的字段的唯一组合对原始结果进行分组。

希望这会有所帮助。

【讨论】:

谢谢,这正是我想要的。 可以按这个机型外键的外键分组吗?我试图做values('first_fk__second_fk'),但它仍然被first_fk分开。

以上是关于django聚合多天的主要内容,如果未能解决你的问题,请参考以下文章

Django 聚合与查询集API

Django 1.10中文文档-聚合

Django(18)聚合函数

Django 09-1模型层 查询(分组聚合)

Django聚合函数与分组查询

Django/Postgres:在 RangeField 上聚合