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

Odoo13中重写方法追加字典新项时出现‘bool’对象无‘dict_one’属性错误的技术求助

解决Odoo 13重写action_transaction_done时的布尔对象属性错误

嘿,我来帮你搞定这个问题!你遇到的'bool' object has no attribute 'dict_one'错误,主要是因为对原方法的返回值理解有误,咱们一步步拆解解决:

错误根源分析

  1. 属性理解偏差:你把原方法内部的变量名dict_one当成了返回对象的属性,但实际上原方法返回的是Odoo中用于创建x2many记录的标准元组格式:(0, 0, {字段字典})——dict_one只是原方法里临时存这个元组的变量名,不是返回值的属性。
  2. 返回值类型兼容:在某些场景下(比如状态变更失败、没有符合条件的记录时),原方法可能返回布尔值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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:57:39