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