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

如何将Django QuerySet转换为包含原生数据类型的字典?Decimal类型字段转浮点数实现方案

解决Django values查询中Decimal转浮点数的问题

嘿,这个场景我之前开发的时候也碰到过,给你分享几个实用的解决方案,按需选择就行:

方法1:数据库层面转换(推荐,效率更高)

直接在查询阶段用Django的Cast函数把Decimal字段转成浮点数,这样数据库返回的结果就是原生float类型,不用再在Python里额外遍历处理:

from django.db.models import FloatField, Cast

# 先通过annotate生成转换后的字段,再用values获取目标数据
stock_data = Stock.objects.annotate(
    # 将earnings_yield转成float类型,自定义字段名
    earnings_yield_float=Cast('earnings_yield', output_field=FloatField()),
    roic_float=Cast('roic', output_field=FloatField())
).values(
    "ticker", "stock", "exchange__exchange_code", 
    "earnings_yield_float", "roic_float"
)

这样返回的每一条数据里,earnings_yield_float和roic_float就是浮点数格式,比如{'roic_float': 0.0}。

方法2:Python层面遍历转换

如果不想修改原始查询语句,也可以在拿到查询结果后,遍历每个字典把Decimal类型转为float:

from decimal import Decimal

# 执行原始查询
raw_results = Stock.objects.values("ticker", "stock", "exchange__exchange_code", "earnings_yield", "roic")

# 遍历处理每个结果项
processed_results = []
for item in raw_results:
    processed_item = {}
    for key, value in item.items():
        # 判断值是否为Decimal类型,是则转成float
        processed_item[key] = float(value) if isinstance(value, Decimal) else value
    processed_results.append(processed_item)

也可以用更简洁的字典推导式实现:

processed_results = [
    {k: float(v) if isinstance(v, Decimal) else v for k, v in item.items()}
    for item in raw_results
]

注意事项

要提一句:Decimal转float可能会存在精度丢失的问题,如果你的业务对数值精度要求极高(比如金融类场景),建议谨慎考虑是否一定要转成float。如果只是前端展示或非高精度需求,上面的方法完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:37:34