Python操作MongoDB时int与Decimal128相加报错,求解决方法
MongoDB数据累加类型错误解决方法
问题代码
meal_data = Data.objects.filter(year= se_year, month= se_month, category = 'Meal') meal_amt = 0 for i in meal_data: id = i.id m_amount_data = Data.objects.get(id = id) meal_amt += m_amount_data.amount
报错信息
TypeError: unsupported operand type(s) for +=: 'int' and 'Decimal128'
错误原因
- 类型不兼容:
meal_amt初始为int类型,而MongoDB存储的amount字段是Decimal128类型,Python不支持直接对这两种类型执行加法运算。 - 代码冗余:循环内通过
id再次查询Data对象完全没必要,filter返回的i本身就是完整的Data实例,直接调用i.amount即可。
解决方案
方案1:类型转换+优化循环(推荐精度保留)
使用Python标准库decimal.Decimal处理,避免精度损失:
from decimal import Decimal meal_data = Data.objects.filter(year=se_year, month=se_month, category='Meal') meal_amt = Decimal(0) for item in meal_data: # 将Decimal128转换为Decimal类型后累加 meal_amt += item.amount.to_decimal()
方案2:转Float类型(适合低精度场景)
如果对数值精度要求不高,可以直接转为float:
meal_data = Data.objects.filter(year=se_year, month=se_month, category='Meal') meal_amt = 0.0 for item in meal_data: meal_amt += float(item.amount)
方案3:数据库层面聚合(效率更高)
直接通过MongoDB聚合查询计算总和,无需拉取所有数据到内存循环:
from django.db.models import Sum # 聚合查询总和,若使用djongo等Django-MongoDB适配引擎 aggregate_result = Data.objects.filter( year=se_year, month=se_month, category='Meal' ).aggregate(total=Sum('amount')) meal_amt = aggregate_result['total'] # 处理聚合结果为Decimal或Float if meal_amt: meal_amt = meal_amt.to_decimal() # 或float(meal_amt) else: meal_amt = Decimal(0) # 或0.0
内容的提问来源于stack exchange,提问作者Gubbu
相关产品推荐
相关产品推荐

