You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现Django查询集生成的字典列表各键值求和

计算Django QuerySet衍生字典列表的键值总和

嘿,这个需求我经常碰到,给你两种实用的解决思路——一种是处理已经拿到手的字典列表,另一种是利用Django的特性直接在数据库层面聚合(推荐数据量大时用):

方法1:纯Python处理现有字典列表

如果你已经得到了email_sent_count这个字典列表,直接用Python循环累加或者更简洁的推导式就能搞定:

基础循环法(更直观,适合新手)

# 初始化总和字典,预设所有需要统计的键,初始值为0
total_counts = {
    'initial_count': 0,
    'first_follow_count': 0,
    'second_follow_count': 0,
    'third_follow_count': 0
}

# 遍历每个统计项,把对应键的值累加到总和字典里
for item in email_sent_count:
    for key in total_counts:
        # 用get避免键不存在时报错,默认加0
        total_counts[key] += item.get(key, 0)

# 输出结果:{'initial_count': 3, 'first_follow_count': 2, 'second_follow_count': 3, 'third_follow_count': 2}
print(total_counts)

简洁推导式法

如果你的字典列表里每个字典的键都一致,可以用字典推导结合sum()函数,一行搞定:

# 先判断列表非空,避免取第一个元素时报错
if email_sent_count:
    total_counts = {
        key: sum(item[key] for item in email_sent_count)
        for key in email_sent_count[0].keys()
    }
else:
    # 列表为空时返回全0的默认字典
    total_counts = {'initial_count': 0, 'first_follow_count': 0, 'second_follow_count': 0, 'third_follow_count': 0}

方法2:直接用Django QuerySet聚合(推荐)

既然你的数据来源于Django QuerySet,强烈建议直接在数据库层面做聚合,不用把所有数据拉到内存里转成列表再处理,性能提升非常明显,尤其是数据量较大的时候。

假设你的模型是EmailLog(替换成你实际的模型名),字段和字典里的键对应,直接用aggregate()结合Sum聚合函数:

from django.db.models import Sum

# 直接从QuerySet聚合所有需要的字段
total_counts = EmailLog.objects.aggregate(
    initial_total=Sum('initial_count'),
    first_follow_total=Sum('first_follow_count'),
    second_follow_total=Sum('second_follow_count'),
    third_follow_total=Sum('third_follow_count')
)

# 结果示例:{'initial_total': 3, 'first_follow_total': 2, 'second_follow_total': 3, 'third_follow_total': 2}

如果你的数据是从过滤后的QuerySet来的(比如已经筛选了特定日期或条件的记录),直接在过滤后的QuerySet上调用aggregate()即可:

# 先过滤QuerySet
filtered_qs = EmailLog.objects.filter(sent_date__gte=some_start_date)
# 再聚合
total_counts = filtered_qs.aggregate(
    initial_total=Sum('initial_count'),
    first_follow_total=Sum('first_follow_count'),
    second_follow_total=Sum('second_follow_count'),
    third_follow_total=Sum('third_follow_count')
)

注意:如果你的字典列表是通过QuerySet的values()方法生成的,那完全没必要先转成列表,直接用上面的聚合方法更高效!

内容的提问来源于stack exchange,提问作者Shubham Srivastava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:50:55