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

如何解决Odoo 9中TypeError: float()参数必须是字符串或数字错误

解决Odoo 9中product_print_zpl_barcode模块的float类型错误

你遇到的这个TypeError: float() argument must be a string or a number错误,根源是代码里对price_get()方法的返回值处理出错了。

错误原因分析

Odoo的pricelist_id.price_get()方法返回的是一个字典,格式类似{pricelist_id: product_price},而不是单个数值。你原代码里直接把这个字典赋值给浮点型字段price_uom,还拿它和quantity做乘法,Python自然会报错——字典没法直接转成float类型。

看你提供的原代码片段:

price_uom = wiz.pricelist_id.price_get(wiz.product_id.id, 1)
wiz.price_uom = price_uom
wiz.price = price_uom * wiz.quantity

这里的price_uom是字典,不是数字,这就是问题所在。

修正后的代码

把_compute_price方法改成下面这样就能解决问题:

@api.depends('pricelist_id', 'quantity', 'product_id')
def _compute_price(self):
    # for regular barcodes
    for wiz in self:
        if wiz.pricelist_id and wiz.product_id:
            # 获取价格字典:键是价格表ID,值是对应单价
            price_dict = wiz.pricelist_id.price_get(wiz.product_id.id, 1)
            # 提取当前选中价格表对应的单价,默认0.0避免KeyError
            price_uom = price_dict.get(wiz.pricelist_id.id, 0.0)
            wiz.price_uom = price_uom
            wiz.price = price_uom * wiz.quantity
    # 原代码的return wiz.price是多余的,计算字段不需要返回值

关键修正点

  1. 正确处理字典返回值:用price_dict.get(wiz.pricelist_id.id, 0.0)提取对应价格表的单价,同时设置默认值0.0,防止出现找不到键的异常。
  2. 移除多余的return语句:Odoo的计算字段只需要给字段赋值,不需要返回任何值,原return语句完全没用。
  3. 类型匹配检查:确保price_uom和price字段在模型里是用fields.Float()定义的,字段类型不匹配也可能触发类似错误。

替换完代码后,重启Odoo服务并更新模块,再点击打印条码按钮应该就不会报错了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:23:41