Django 注释和聚合

问题描述

我想对每个 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}"

谢谢。

解决方法

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

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

因此我们可以将所有 post_valueUser 的数量与:

Post.objects.all().count()

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

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

或者如果您有 ID:

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

或者,如果您想总结 post_value,您可以使用:

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,它总结了 related Post 的值。如果用户没有相关的 None,则这些可以是 Post。在这种情况下,我们可以工作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))
)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...