如何解决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是多余的,计算字段不需要返回值
关键修正点
- 正确处理字典返回值:用
price_dict.get(wiz.pricelist_id.id, 0.0)提取对应价格表的单价,同时设置默认值0.0,防止出现找不到键的异常。 - 移除多余的return语句:Odoo的计算字段只需要给字段赋值,不需要返回任何值,原return语句完全没用。
- 类型匹配检查:确保
price_uom和price字段在模型里是用fields.Float()定义的,字段类型不匹配也可能触发类似错误。
替换完代码后,重启Odoo服务并更新模块,再点击打印条码按钮应该就不会报错了。
内容的提问来源于stack exchange,提问作者Dhouha
相关产品推荐
相关产品推荐

