首页 > 解决方案 > 在 Django 中使用多个注解

问题描述

这是我的数据库:

class User(models.Model):
   Name = models.TextField(null=True, blank=True, default=None)

class Salary(models.Model):
   value = models.PositiveIntegerField(default=1)
   name = models.ForeignKey(User, related_name='salarys', on_delete=models.CASCADE)

class Expense(models.Model):
   value = models.PositiveIntegerField(default=1)
   name = models.ForeignKey(User, related_name='expenses', on_delete=models.CASCADE)

I want to add all the salary and expenses of a user. 

queryset = User.objects.annotate(total_salary=Sum('salarys__value', distinct=True) ,total_expense=Sum('expenses__value', distinct=True))

这是我的数据:

User table
id=1; name= ram

Salary table
id =1; value = 12000
id = 2; value = 8000

Expense table
id =1; value=5000
id=2; value = 3000

预期产出: total_Salary = 20000;total_expense=8000 输出

获得: total_salary=40000;总费用 = 16000

每个输出都乘以另一个表中的数据的次数。谁能帮我解决这个问题

标签: django

解决方案


如果您尝试组合类似的聚合,看起来这是不可能的。仅适用于具有不同的计数。如需关闭,请参阅文档:https ://docs.djangoproject.com/en/4.0/topics/db/aggregation/#combining-multiple-aggregations

由于 annotate 返回一个查询集而不是一个 dict(在聚合的情况下),您可以尝试链接多个 like values().annotate("field1").annotate("field2")。为我工作,但请从您的查询集中检查 sql 以进行调试,以防您无法按需要运行查询。


推荐阅读