问题描述
我想对每个 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_value
的 User
的数量与:
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))
)