Django和Aggregate:不同值的总和?

Joh*_*str 12 django django-orm

我正在尝试执行django聚合函数,但无法产生所需的结果.

我得到了什么:

income_posts.values_list('category__name','amount')
[(u'Donation', Decimal("2000.00")), (u'Paycheck', Decimal("1200.00")), (u'Donation', Decimal("1000.00"))]
Run Code Online (Sandbox Code Playgroud)

期望的结果:

[(u'Donation', Decimal("3000.00")), (u'Paycheck', Decimal("1200.00))]
Run Code Online (Sandbox Code Playgroud)

我需要对具有相同category__name的'amount'字段求和.

Jor*_*ter 19

这个答案的相关问题:

from django.db.models import Sum
income_posts.values('category__name').order_by('category__name').annotate(total=Sum('amount'))
Run Code Online (Sandbox Code Playgroud)

  • 之所以可行,是因为[`.annotate()`在`.values()`之后的工作方式略有不同。(https://docs.djangoproject.com/en/dev/topics/db/aggregation/#values) :“但是,当使用values()子句约束结果集中返回的列时,评估注释的方法略有不同。原始结果不是返回原始QuerySet中每个结果的注释结果,而是原始结果将根据values()子句中指定的字段的唯一组合进行分组。” (2认同)

NKS*_*KSM 10

我认为这个问题也与组合多个聚合有关。

这是此错误的票证。

我们可以使用SubqueryDjango Docs)来实现这个问题:

from django.db.models import Subquery, OuterRef, IntegerField, Sum, Value, Count

MyModel.objects.annotate(
    count_model_a=Count('ModelA', distinct=True), 
    sum_model_b=Coalesce(
        Subquery(
            ModelB.objects.filter(
                MyModel=OuterRef('pk')
            ).values('MyModel_id').annotate(
                my_sum=Sum('MyModel_Field')
            ).values('my_sum')[:1],
            output_field=IntegerField()
        ),
        Value(0)
    )
).values("count_model_a", "sum_model_b")
Run Code Online (Sandbox Code Playgroud)

我还使用CoalesceDjango Docs)函数来防止返回None

上面的代码将对数据库运行一个查询。


Tho*_*low 8

只是为了增加arjun27的答案。由于该软件包似乎已被放弃,您可能只想复制其中需要的3行:

from django.db.models import Sum
class DistinctSum(Sum):
    function = "SUM"
    template = "%(function)s(DISTINCT %(expressions)s)"
Run Code Online (Sandbox Code Playgroud)

可以和上面一样使用:

income_posts.annotate(total=DistinctSum('amount')
Run Code Online (Sandbox Code Playgroud)

  • 没问题,但相同数量来自不同来源的情况除外 (2认同)

小智 5

Django 3.0 在 Sum 和 Avg 上引入了“distinct=True”:https : //docs.djangoproject.com/en/3.0/ref/models/querysets/#sum