Django SUM查询?

112 投票
2 回答
141222 浏览
提问于 2025-04-16 20:17

我有一个类似下面的查询:

SELECT SUM(name) FROM table WHERE name IS NULL

那这个 SUM 在 Django 中是怎么变成 QuerySet 的呢?也就是说,它在像 MyModel.objects.xyz() 这样的操作中,具体对应什么操作 xyz 呢?

2 个回答

1

你还可以给返回的值起个别名:

MyModel.objects.aggregate(total=Sum('field_1'))

这样会返回一个字典,比如 {'total': 12345}

如果你需要过滤一下要加总的值,另一种方法是通过 Q 对象使用 Sum 对象的 filter= 参数。下面的代码会返回 field_1 的总和,前提是对应的 field_2 的值是空的,也就是相当于 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}

214

更新:下面的内容包含了原始查询中的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

你需要的是求和的聚合函数,它的工作原理如下:

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

查看: https://docs.djangoproject.com/en/dev/ref/models/querysets/#sum

撰写回答