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

重写res.users类write方法报错TypeError,求技术解决方案

解决Odoo重写res.users write方法时的TypeError问题

你遇到的错误核心是调用父类write方法时没有传递必要参数,另外代码里还有几个细节需要调整,我帮你一步步修正:

错误原因拆解

  1. 调用super(User, self).write()时没传values参数,Odoo原生的write方法需要接收更新数据,框架还会自动传递context等参数,缺少这些就会触发TypeError。
  2. 在@api.multi的多记录集环境下,直接用self.is_commercial会有问题——self是多条记录的集合,得循环每条用户单独处理。
  3. 循环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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:43:14