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

Django中对QuerySet去重并累加相同product的quantity方法

问题描述

现有如下Django QuerySet:

<QuerySet 
    [{'product': 6, 'quantity': 1}, 
    {'product': 6, 'quantity': 10}, 
    {'product': 7, 'quantity': 2}, 
    {'product': 9, 'quantity': 3}]
>

需要提取唯一的product记录,当存在相同product时累加对应的quantity值,处理后的预期结果为:

<QuerySet 
    [{'product': 6, 'quantity': 11}, 
    {'product': 7, 'quantity': 2}, 
    {'product': 9, 'quantity': 3}]
>

解决方案

方案一:数据库层面聚合(推荐)

如果这个QuerySet是从数据库查询得到的,直接在查询阶段做聚合操作效率更高,无需将全量数据加载到内存处理。假设你的模型为OrderItem(替换为你的实际模型名称),包含product(整数或外键字段)和quantity字段,代码如下:

from django.db.models import Sum

# 按product分组,累加quantity
result = OrderItem.objects.values('product').annotate(quantity=Sum('quantity')).order_by('product')
  • values('product'):指定以product字段作为分组依据
  • annotate(quantity=Sum('quantity')):对每个分组内的quantity求和,将结果存入quantity字段(与示例输出的键名保持一致)
  • order_by('product'):可选操作,用于保证结果按product排序

执行后得到的QuerySet即为分组求和后的目标结果。

方案二:Python内存层面处理

如果已经获取了现有QuerySet,不想再发起数据库查询,可以通过Python字典在内存中完成聚合:

from collections import defaultdict

# 假设原QuerySet变量名为queryset
aggregated_data = defaultdict(int)
for item in queryset:
    aggregated_data[item['product']] += item['quantity']

# 转换为与原格式一致的列表结构
result = [{'product': prod_id, 'quantity': total_qty} for prod_id, total_qty in aggregated_data.items()]

# 若需转为QuerySet类型(仅当数据对应模型实例时适用)
# from django.db.models.query import QuerySet
# result = QuerySet(model=YourModel).from_iterable(result)

这种方式适合数据量较小的场景,数据量大时优先选择数据库聚合方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:20:48