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

升级模块后One2many字段报错,重启服务器后消失的问题

Odoo One2many字段模块升级后触发AttributeError问题排查

问题症状

创建res.partner.brand新记录时,One2many字段discount_ids触发AttributeError: '_unknown' object has no attribute 'id'错误;该错误仅在模块升级后出现,重启服务器后消失,重复升级模块会复现问题。

涉及模型及字段定义

Model: res.partner.brand

discount_ids = fields.One2many("res.partner.brand.discount", "partner_brand_id", string = "Descuentos marca/proveedor", copy=True)

Model: res.partner.brand.discount

partner_brand_id = fields.Many2one('res.partner.brand', string = "Proveedor marca")
brand_id = fields.Many2one('product.brand', string = "Marca", related="partner_brand_id.brand_id", readonly=True)
discount_id = fields.Many2one('discount', string = "Descuento")

完整错误日志

RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_http.py", line 237, in _dispatch
    result = request.dispatch()
  File "/usr/lib/python3/dist-packages/odoo/http.py", line 698, in dispatch
    result = self._call_function(**self.params)
  File "/usr/lib/python3/dist-packages/odoo/http.py", line 368, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 94, in wrapper
    return f(dbname, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/odoo/http.py", line 357, in checked_call
    result = self.endpoint(*a, **kw)
  File "/usr/lib/python3/dist-packages/odoo/http.py", line 921, in __call__
    return self.method(*args, **kw)
  File "/usr/lib/python3/dist-packages/odoo/http.py", line 546, in response_wrap
    response = f(*args, **kw)
  File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 1324, in call_kw
    return self._call_kw(model, method, args, kwargs)
  File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 1316, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "/usr/lib/python3/dist-packages/odoo/api.py", line 469, in call_kw
    result = _call_kw_multi(method, model, args, kwargs)
  File "/usr/lib/python3/dist-packages/odoo/api.py", line 456, in _call_kw_multi
    result = method(recs, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/odoo/models.py", line 6525, in onchange
    result['value'] = snapshot1.diff(snapshot0, force=first_call)
  File "/usr/lib/python3/dist-packages/odoo/models.py", line 6349, in diff
    result[name] = field.convert_to_onchange(self[name], record, {})
  File "/usr/lib/python3/dist-packages/odoo/fields.py", line 2853, in convert_to_onchange
    return super().convert_to_onchange(value._origin, record, names)
  File "/usr/lib/python3/dist-packages/odoo/fields.py", line 889, in convert_to_onchange
    return self.convert_to_read(value, record)
  File "/usr/lib/python3/dist-packages/odoo/fields.py", line 2829, in convert_to_read
    return value.id
Exception

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/odoo/http.py", line 654, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "/usr/lib/python3/dist-packages/odoo/http.py", line 301, in _handle_exception
    raise exception.with_traceback(None) from new_cause
AttributeError: '_unknown' object has no attribute 'id'

排查方向及解决方案建议

  • 调整关联字段计算逻辑:给brand_id显式添加store=False(虽然related字段默认该值),或在视图层面通过域控制只读显示,避免在onchange阶段触发未初始化字段的计算。
  • 升级后强制清除模型缓存:在模块的__manifest__.py中添加post_init_hook,升级后主动清除相关模型缓存,无需重启服务器:
    def post_init_hook(cr, registry):
        from odoo import api
        env = api.Environment(cr, 1, {})
        env['res.partner.brand'].clear_caches()
        env['res.partner.brand.discount'].clear_caches()
    
  • 明确模块依赖顺序:在__manifest__.py的depends中添加product.brand和discount模型所属模块,确保升级时关联模型已完全加载。
  • 自定义onchange逻辑:重写res.partner.brand的onchange方法,手动处理discount_ids的字段赋值,规避Odoo默认转换逻辑的错误:
    @api.onchange('discount_ids')
    def _onchange_discount_ids(self):
        for rec in self.discount_ids:
            if not rec.partner_brand_id:
                rec.partner_brand_id = self.id
    
  • 临时规避方案:模块升级后手动点击系统设置中的「清除缓存」按钮,或编写自动重启脚本,避免错误触发。

内容的提问来源于stack exchange,提问作者Manu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:39:55