Django为每个用户汇总总和

lqfhib0f  于 2023-01-27  发布在  Go
关注(0)|答案(3)|浏览(147)

我正在创建一个预算应用程序,并希望找到每个已登录用户的费用总和。现在,我使用基于函数的视图,并使用Post.objects.aggregate(sum = Sum('expense'))对费用求和。问题是,它对数据库中的每个人求和,但我希望它只对当前已登录用户的费用求和。在我的模型中,我有一个作者字段,但我不知道如何去求和只为用户当前登录。

xzabzqsa

xzabzqsa1#

您可以执行类似以下操作来获取当前用户费用
Post.objects.filter(author=request.user).aggregate(sum = Sum('expense'))这将返回当前登录用户的总和。

9jyewag0

9jyewag02#

您可以使用以下命令注解每个用户的总和:

from django.db.models import Sum

User.objects.annotate(total=Sum('post__expense'))

由此QuerySet产生的User对象将包含相关postexpense之和。
对于已登录的用户,可以使用以下公式计算:

from django.db.models import Sum

request.user.post_set.aggregate(total=Sum('expense'))['total'] or 0
az31mfrm

az31mfrm3#

您可以将aggregate()和annotate()与Sum()一起使用,按用户对Post模型中的expense列求和,如下所示。* 您需要将order_by('pk')annotate()一起使用,否则将按降序打印值:

from django.db.models import Sum

for obj in User.objects.all(): 
    print(Post.objects.filter(user=obj).aggregate(Sum('expense')))

for obj in User.objects.all(): 
    print(obj.post_set.aggregate(Sum('expense')))

qs = User.objects.annotate(Sum('post__expense')).order_by('pk')
for obj in qs:
    print(obj.post__expense__sum)

并且,您可以将expense列的默认键expense__sumpost__expense更改为expenseSum,如下所示:

from django.db.models import Sum

for obj in User.objects.all():                    # ↓ Here
    print(Post.objects.filter(user=obj).aggregate(expenseSum=Sum('expense')))

for obj in User.objects.all():   # ↓ Here
    print(obj.post_set.aggregate(expenseSum=Sum('expense')))
                           # ↓ Here
qs = User.objects.annotate(expenseSum=Sum('post__expense')).order_by('pk')
for obj in qs: # ↓ Here
    print(obj.expenseSum)

相关问题