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

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'

错误原因

  1. 类型不兼容:meal_amt初始为int类型,而MongoDB存储的amount字段是Decimal128类型,Python不支持直接对这两种类型执行加法运算。
  2. 代码冗余:循环内通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:55:21