重写res.users类write方法报错TypeError,求技术解决方案
解决Odoo重写res.users write方法时的TypeError问题
你遇到的错误核心是调用父类write方法时没有传递必要参数,另外代码里还有几个细节需要调整,我帮你一步步修正:
错误原因拆解
- 调用
super(User, self).write()时没传values参数,Odoo原生的write方法需要接收更新数据,框架还会自动传递context等参数,缺少这些就会触发TypeError。 - 在
@api.multi的多记录集环境下,直接用self.is_commercial会有问题——self是多条记录的集合,得循环每条用户单独处理。 - 循环
self.partner_id的逻辑不对,应该遍历self(每个用户),再关联对应的partner_id。
修正后的完整代码
res.users 重写部分
from odoo import models, fields, api class User(models.Model): _inherit = 'res.users' is_commercial = fields.Boolean(string='Is Commercial') @api.multi def write(self, values): # 先调用父类write方法,确保用户自身字段先完成更新 result = super(User, self).write(values) # 遍历每条用户记录,同步更新对应的合作伙伴字段 for user in self: # 优先取本次更新的新值,没有的话用用户当前的字段值 commercial_value = values.get('is_commercial', user.is_commercial) if user.partner_id: user.partner_id.write({'is_commercial': commercial_value}) return result
res.partner 部分(原有代码无需修改)
from odoo import models, fields class Partner(models.Model): _inherit = 'res.partner' is_commercial = fields.Boolean(string='Is Commercial')
关键修改说明
- 传递参数给父类write:必须把
values传给super().write(),这样父类方法才能正常处理字段更新,框架自动传递的context等参数也能被正确接收。 - 循环处理单条记录:
@api.multi下self是记录集,遍历每条用户能确保每个用户对应的合作伙伴都被精准同步。 - 兼容多种更新场景:用
values.get('is_commercial', user.is_commercial)覆盖两种情况:如果本次更新的是is_commercial字段就用新值;如果是更新其他字段,就同步用户当前的is_commercial值给合作伙伴。
这样修改后,更新用户的is_commercial字段时,对应的合作伙伴字段会同步更新,同时不会再出现TypeError的问题。
内容的提问来源于stack exchange,提问作者Tessnim
相关产品推荐
相关产品推荐

