Odoo13中重写方法追加字典新项时出现‘bool’对象无‘dict_one’属性错误的技术求助
解决Odoo 13重写
action_transaction_done时的布尔对象属性错误 嘿,我来帮你搞定这个问题!你遇到的'bool' object has no attribute 'dict_one'错误,主要是因为对原方法的返回值理解有误,咱们一步步拆解解决:
错误根源分析
- 属性理解偏差:你把原方法内部的变量名
dict_one当成了返回对象的属性,但实际上原方法返回的是Odoo中用于创建x2many记录的标准元组格式:(0, 0, {字段字典})——dict_one只是原方法里临时存这个元组的变量名,不是返回值的属性。 - 返回值类型兼容:在某些场景下(比如状态变更失败、没有符合条件的记录时),原方法可能返回布尔值
True/False,这时候你去访问res.dict_one自然会报错。
修正后的重写代码
直接用下面的代码替换你的重写方法,就能实现追加branch_id的需求,同时兼容不同的返回值类型:
def action_transaction_done(self): res = super(ProjectTransaction, self).action_transaction_done() # 先判断返回值是不是我们需要的x2many创建元组 if isinstance(res, tuple) and len(res) == 3 and res[0] == 0 and isinstance(res[2], dict): # 元组的第三个元素就是我们要修改的字典,直接追加branch_id res[2]['branch_id'] = self.branch_id.id # 如果返回的是布尔值(比如状态操作结果),直接返回即可 return res
额外提醒:原方法的潜在问题
你贴的原方法代码还有几个坑,建议一起修正,避免后续出问题:
date变量未定义:得给它赋值,比如用datetime.date.today()获取当前日期- 循环逻辑有问题:
for action in self会循环当前记录集的每一条记录,每次循环都会覆盖dict_one,最终只返回最后一条记录生成的元组,这可能不符合你的业务预期 - 无默认返回值:如果
self.account_id不存在或者details_by_category为空,dict_one变量会未定义,直接返回会抛出NameError
给你一个修正后的原方法参考:
from datetime import date def action_transaction_done(self): dict_one = None for action in self: for line in action.details_by_category: if self.account_id: current_date = date.today() dict_one = (0, 0, { 'name': line.name, 'partner_id': line._get_partner_id(credit_account=False), 'account_id': self.account_id.id, # 这里要取id,不能直接传对象 'journal_id': action.journal_id.id, 'date': current_date, }) # 确保即使没有生成元组也不会报错,返回False或者None都可以 return dict_one or False
内容的提问来源于stack exchange,提问作者SH EB
相关产品推荐
相关产品推荐

