【问题标题】:Django Annotate and AggregateDjango 注释和聚合
【发布时间】:2021-05-20 10:56:21
【问题描述】:

我想对每个 post_user 的所有帖子的 post_value 求和,以最终在图表中使用。我正在为如何制定查询而苦恼?

到目前为止,我必须:

user_totals = User.objects.annotate(post_value_total=Sum('post'))

models.py

class User(AbstractUser):
    pass

class Post(models.Model):
    post_user = models.ForeignKey(User, on_delete=models.CASCADE)
    post_cat = models.ForeignKey(Category, on_delete=models.CASCADE)
    post_action = models.ForeignKey(Action, on_delete=models.CASCADE)
    post_quantity = models.PositiveIntegerField(blank=True, null=True)
    post_value = models.PositiveIntegerField(default='0')
    post_timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.post_user}'s post at {self.post_timestamp}"

谢谢。

【问题讨论】:

  • 所以你想要Posts 的总数?由于每个Post 都有一个指向post_user 的非NULL 字段,因此所有用户的Posts 总数就是Posts 的总数。

标签: django-models django-annotate django-aggregation


【解决方案1】:

我想对每个 post_user 的所有帖子的 post_value 求和,以最终在图表中使用。

由于每个Post 都有一个不可为空的post_user ForeignKey,这意味着每个Post恰好属于一个用户。

因此,我们可以将所有Users 中的post_values 的数量总结为:

Post.objects.all()<b>.count()</b>

如果您只想为一部分用户总结这些,您可以使用:

Post.objects.filter(
    post_user__in=[user1, user2, user3]
).count()

或者如果你有身份证:

Post.objects.filter(
    post_user_id__in=[user_id1, user_id2, user_id3]
).count()

或者如果你想总结post_values,你可以使用:

from django.db.models import Sum

total_post_value = Post.objects.aggregate(
    total=Sum('post_value')
) or 0

如果集合可以为空,则or 0 是必需的,因为没有记录的总和是NULL/None,而不是0

或者如果你想这样做 per User,我们可以合作:

user_totals = User.objects.annotate(
    post_value_total=Sum('post__post_value')
)

由此产生的User 对象将具有一个额外的属性post_value_total,它总结了相关 Posts 的值。如果用户没有相关的Posts,则这些可以是None。在这种情况下,我们可以工作Coalesce [Django-doc]

from django.db.models import Sum, Value
from django.db.models.functions import Coalesce

user_totals = User.objects.annotate(
    post_value_total=Coalesce(Sum('post__post_value'), Value(0))
)

【讨论】:

  • 谢谢Willem,但我想求和每个用户记录的所有帖子的post_value,而不是每个用户的帖子数?
  • @EwanWillsmer:通过使用计数,我们聚合,因此我们将统计所有用户提交的帖子总数(代码片段1) ,或者如果我们想为特定的用户组执行此操作(片段 2 和 3)。因此,这些都将返回一个 scalar 整数。
  • post_value 是 Post 模型中的一个字段。我对帖子的数量不感兴趣,我对与每个用户相关的所有帖子的总 post_value 感兴趣。
  • @EwanWillsmer:那么您只是想总结每个Postpost_values?由于每个 Post 都与 one 完全相关,因此先注释并不重要。
  • 非常感谢您的帮助,但我想为每个用户获取一个 total_post_value。 total_post_value 将是他们每个帖子的 post_value 的总和。
猜你喜欢
  • 2016-11-18
  • 2021-01-20
  • 2011-07-07
  • 2023-03-29
  • 2018-07-06
  • 1970-01-01
  • 2017-07-21
  • 2020-05-23
  • 2015-12-29
相关资源
最近更新 更多