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

如何去除Django Queryset返回结果中的Decimal封装,适配Chart.js数据要求

解决方法如下:

方法1:循环时直接转换类型

在往data列表追加数据时,直接将Decimal类型转为目标数值类型即可,如果你确认计算结果都是整数,直接转int:

for each in total_transactions_by_user:
    labels.append(each["coin__name"])
    # 转换Decimal为普通整数
    data.append(int(each["total"]))
    # 如果有小数精度需求,可以改为转float:data.append(float(each["total"]))

转换后data列表就会变为[1220, 160],完全适配Chart.js的数值要求。

方法2:ORM查询阶段直接转换(效率更高,无需额外循环处理)

你可以在聚合查询时使用Django内置的Cast方法,直接把聚合结果转换为数值类型,后续无需额外处理:
首先导入依赖模块:

from django.db.models import IntegerField, Cast

修改你的annotate聚合语句:

total_transactions_by_user =  filtered_transaction_query_by_user.values('coin__name').annotate( 
    total = Cast(Sum('trade_price') * Sum('number_of_coins'), output_field=IntegerField()) 
).order_by('-total')

修改后直接读取each["total"]就已经是整数类型,不需要额外转换。

方法3:返回JSON时自动处理(适合接口直接返回场景)

如果你是把数据通过JsonResponse直接返回给前端,你可以使用Django内置的DjangoJSONEncoder自动处理Decimal类型,不需要手动转换每个值:

from django.core.serializers.json import DjangoJSONEncoder
from django.http import JsonResponse

# 这里的data可以直接放Decimal类型的列表,编码器会自动转换
return JsonResponse({"labels": labels, "data": data}, encoder=DjangoJSONEncoder)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:36:03