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

使用django-firebird查询DecimalField时报float无quantize属性错误如何解决

问题根因

报错核心是django-firebird 2.2a1版本的DecimalField转换器逻辑顺序错误:

  • Firebird数据库取出的Decimal类型值被fdb驱动默认转为float类型
  • firebird/operations.py中的convert_decimalfield_value方法先调用了要求输入为Decimal类型的utils.format_number,之后才执行float转Decimal的操作,顺序颠倒导致触发属性错误。

解决方案

临时修复(修改本地依赖代码)

找到环境中~/.pyenv/versions/crm-nov21/lib/python3.7/site-packages/firebird/operations.py文件,定位到convert_decimalfield_value方法,将原有代码:

val = utils.format_number(value, field.max_digits, field.decimal_places)
value = decimal.Decimal.from_float(float(val))
return value

调整为如下逻辑即可:

def convert_decimalfield_value(self, value, expression, connection, context):
    # 空值直接返回
    if value is None:
        return None
    field = expression.field
    # 先把float转Decimal再做格式化
    if isinstance(value, float):
        # 用字符串中转避免浮点精度丢失
        value = decimal.Decimal(str(value))
    value = utils.format_number(value, field.max_digits, field.decimal_places)
    return value

修改完成后重启Django服务,查询即可正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:07