Django SUM查询?

112

我有一个类似于以下的查询:

SELECT SUM(name) FROM table WHERE name IS NULL

在Django中,SUM如何转换为QuerySet?也就是说,在类似于MyModel.objects.xyz()的语法中,它对应哪个xyz操作?


如果你有高级用例,你可能需要条件表达式。https://docs.djangoproject.com/en/1.11/ref/models/conditional-expressions/#conditional-aggregation - Pykler
2个回答

213

更新:以下内容包括原始查询中的ISNULL方面:

from django.db.models import Sum

ModelName.objects.filter(field_name__isnull=True).aggregate(Sum('field_name'))
# returns {'field_name__sum': 1000} for example

你正在寻找Sum聚合函数,它的工作原理如下:

ModelName.objects.aggregate(Sum('field_name'))

请参见:https://docs.djangoproject.com/en/dev/ref/models/querysets/#sum


2
我认为你可以在查询中使用过滤器来实现。虽然我没有测试过,但是类似这样的代码应该可以工作:ModelName.objects.filter(field_name__isnull=True).aggregate(Sum('field_name')) - rolling stone
result = ModelName.objects.aggregate(total=Sum('field_name'))['total'] - dani herrera

0
你还可以给返回的值取一个别名:
MyModel.objects.aggregate(total=Sum('field_1'))

返回一个类似于{'total': 12345}的字典。

如果您需要对要求和的值进行过滤,另一种方法是使用Sum对象通过Q对象的filter=参数。以下代码返回field_2值为空的field_1值的总和,即等同于SQL查询SELECT SUM(field_1) FROM table WHERE field_2 IS NULL

from django.db.models import Q, Sum
MyModel.objects.aggregate(total=Sum('field_1', filter=Q(field_2__isnull=True)))

你还可以使用字典来存储总和,并在传递给aggregate()时解包为关键字参数。
dct = {'total': Sum('field_1', filter=Q(field_2__isnull=True))}
MyModel.objects.aggregate(**dct)

两者都会返回一个类似于{'total': 1234}的字典。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接