如何将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
相关产品推荐
相关产品推荐

