Django中实现相同KARIŞIM KODU的HARMAN值求和合并记录
实现思路与代码示例
方案一:新增数据时实时合并(推荐)
在处理POST请求创建数据时,先检查是否存在相同karisim的记录,存在则直接累加harman值,不存在再新建。修改视图代码如下:
from django.http import JsonResponse from .models import ProjeVerileri def handle_proje_verileri(request): if request.method == 'POST': karisim = request.POST.get('karisim') harman_str = request.POST.get('harman') # 转换为对应数值类型,根据字段实际类型调整(比如DecimalField用Decimal) try: harman_value = int(harman_str) except ValueError: return JsonResponse({'status': 'error', 'msg': 'Harman值格式错误'}, status=400) # 查找或创建记录 record, is_new = ProjeVerileri.objects.get_or_create( karisim=karisim, defaults={'harman': harman_value} ) # 非新建则累加更新 if not is_new: record.harman += harman_value record.save() return JsonResponse({ 'status': 'success', 'data': {'karisim': record.karisim, 'harman': record.harman} }) return JsonResponse({'status': 'error', 'msg': '仅支持POST请求'}, status=405)
方案二:批量合并已有重复记录
如果数据库已经存在大量重复karisim的记录,需要一次性合并,可执行以下脚本(在Django Shell或自定义管理命令中运行):
from .models import ProjeVerileri from django.db.models import Sum # 按karisim分组求和 aggregated_result = ProjeVerileri.objects.values('karisim').annotate(total_harman=Sum('harman')) # 注意:执行前务必备份数据! ProjeVerileri.objects.all().delete() # 批量插入合并后的记录 ProjeVerileri.objects.bulk_create( [ProjeVerileri(karisim=item['karisim'], harman=item['total_harman']) for item in aggregated_result] )
方案三:查询时动态合并(不修改数据库)
如果不需要改变数据库存储,仅在展示时合并数据,直接用聚合查询即可:
from django.db.models import Sum # 获取合并后的结果集 merged_data = ProjeVerileri.objects.values('karisim').annotate(total_harman=Sum('harman')).order_by('karisim') # 遍历使用示例 for item in merged_data: print(f"KARIŞIM KODU: {item['karisim']}, HARMAN: {item['total_harman']}")
关键提示
- 方案一从源头避免重复记录,适合日常新增数据场景;
- 方案二会清空原有数据,操作前必须备份;
- 方案三仅用于展示需求,不改变数据库结构。
内容的提问来源于stack exchange,提问作者EMRE DAL
相关产品推荐
相关产品推荐

