【问题标题】:How to agregate integerfield in django template if 2 model share the same field's value?如果 2 个模型共享相同字段的值,如何在 django 模板中聚合整数字段?
【发布时间】:2019-10-24 01:53:18
【问题描述】:

我有这个模型:

class LoggedUserDepartement(models.Model):
    department  = models.CharField(max_length=250, default='Care')
    date        = models.DateField()
    login_count = models.PositiveIntegerField(default=0)

我的 views.py 中有这个查询集:

department_count = LoggedUserDepartement.objects.all()  

在我的模板中我已经这样做了:

{% for item in department_count %}
   {{item.date }} {{item.login_count}} {{item.department}}<br>
   {% endfor %}

这是我得到的结果:

June 8, 2019 3 css
June 8, 2019 1 carefr
June 9, 2019 2 css
June 9, 2019 1 carefr

所以我在这里不能做的是,当我在部门字段上具有相同的值时,我如何合并 2 个项目并聚合登录计数值并且不显示日期字段的值? 而不是我现在得到的结果,我想得到这个:

{% for item in department_count %}
   {{item.login_count}} {{item.department}}<br>
   {% endfor %}
5 css
3 carefr

PS:这个查询集中不需要日期字段,但我以后会在另一个查询集中使用它,所以我不能删除它。

任何帮助将不胜感激。

【问题讨论】:

  • 你能分享你的模型吗?
  • 嗨,Willem,我已经用模型编辑了问题。

标签: django django-models django-templates django-queryset


【解决方案1】:

我们可以进行如下聚合:

from django.db.models import Sum

LoggedUserDepartment.objects.values('department').annotate(
    total_login=Sum('login_count')
).order_by('department')

然后像这样渲染它:

{% for item in department_count %}
    {{ item.total_login }} {{ item.department }}<br>
{% endfor %}

话虽如此,我不确定上述建模是否是解决此问题的最佳方法。这里基本上有两个问题:

  1. 很多列有重复值,看起来你应该做一个模型Department,并用ForeignKey链接到它;和
  2. 您的模型还存储聚合数据(login_counts),而不是聚合单个记录。

这将使数据库难以维护。

【讨论】:

  • 感谢您的解决方案,我正要按照您的建议创建一个新的模型部门,因为它也将链接到用户模型,但我不完全理解第二部分关于汇总数据。
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 2016-07-23
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
相关资源
最近更新 更多