使用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
相关产品推荐
相关产品推荐

