Django models Django注释和聚合

Django models Django注释和聚合,django-models,django-annotate,django-aggregation,Django Models,Django Annotate,Django Aggregation,我想对每个post_用户最终在图表中使用的所有post_值求和。我正在为如何表述这个查询而苦苦挣扎 到目前为止,我必须: 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=

我想对每个post_用户最终在图表中使用的所有post_值求和。我正在为如何表述这个查询而苦苦挣扎

到目前为止,我必须:

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_用户最终在图表中使用的所有post_值求和

由于每个
Post
都有一个不可为空的
Post\u用户
ForeignKey
,这意味着每个
Post
只属于一个用户

因此,我们可以将所有
用户
s的
post\u值
s的数量总结为:

Post.objects.all().count()
如果集合可以为空,则必须使用
或0
,因为无记录的总和为
NULL
/
None
,而不是
0

或者,如果您想为每个
用户执行此操作,我们可以使用:

Post.objects.filter(
    post_user__in=[user1, user2, user3]
).count()
from django.db.models import Sum

total_post_value = Post.objects.aggregate(
    total=Sum('post_value')
) or 0
user_totals = User.objects.annotate(
    post_value_total=Sum('post__post_value')
)

那么您想要的是
Post
s的总数?由于每个
Post
都有一个非空字段,该字段指向一个
Post\u用户
,因此所有用户的
Post
s总数就是
Post
s总数。谢谢Willem,但我正在尝试对每个用户记录的所有Post\u值求和,不是每个用户的帖子数量吗?@EwanWillsmer:通过使用count,我们将聚合,因此我们将计算所有用户提交的帖子总数(代码片段1),或者如果我们想为用户的特定组(片段2和3)这样做的话。因此,这些都将返回一个标量整数。post_值是post模型中的一个字段。我对帖子的数量不感兴趣,我感兴趣的是与每个用户相关的所有帖子的总post_值。@EwanWillsmer:那么您只需要将每个
帖子的
post_值
相加即可?由于每个
Post
都只与一个相关,因此首先进行注释并不重要。我非常感谢您的帮助,但我希望获得每个用户的总Post值。总的post值是他们每个帖子的post值之和。
user_totals = User.objects.annotate(
    post_value_total=Sum('post__post_value')
)
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))
)