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

Odoo 12编辑sale.order.line时出现CacheMiss错误求助

问题描述

当订单包含两行产品时,删除其中一行并添加新的不同产品行,保存订单时触发以下Odoo服务器错误:

Server application error
Error code: 200
Error message: Odoo Server Error
Error data message:
sale.order.line(103,).currency_id
None
Error data debug:
Traceback (most recent call last):
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/api.py", line 1050, in get
value = self._data[key][field][record._ids[0]]
KeyError: 103

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/http.py", line 663, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/http.py", line 321, in _handle_exception
raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/tools/pycompat.py", line 87, in reraise
raise value
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/http.py", line 705, in dispatch
result = self._call_function(**self.params)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/http.py", line 353, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/service/model.py", line 98, in wrapper
return f(dbname, *args, **kwargs)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/http.py", line 346, in checked_call
result = self.endpoint(*a, **kw)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/http.py", line 948, in __call__
return self.method(*args, **kw)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/http.py", line 526, in response_wrap
response = f(*args, **kw)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/addons/web/controllers/main.py", line 959, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/addons/web/controllers/main.py", line 951, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/api.py", line 760, in call_kw
return _call_kw_multi(method, model, args, kwargs)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/api.py", line 747, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "/home/lucas/Documents/work/odoo/voraz/addons/addons/vz_sale/models/sale.py", line 482, in write
rec = super(SaleOrder, self).write(vals)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/addons/mail/models/mail_thread.py", line 320, in write
result = super(MailThread, self).write(values)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/addons/mail/models/mail_activity.py", line 621, in write
return super(MailActivityMixin, self).write(vals)
File "/home/lucas/Documents/work/odoo/voraz/addons/addons/ks_dashboard_ninja/models/ks_odoo_base.py", line 25, in write
recs = super(Base, self).write(vals)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/models.py", line 3403, in write
self.recompute()
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/models.py", line 5325, in recompute
vals = {n: rec[n] for n in ns}
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/models.py", line 5325, in <dictcomp>
vals = {n: rec[n] for n in ns}
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/models.py", line 5171, in __getitem__
return self._fields[key].__get__(self, type(self))
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/fields.py", line 1071, in __get__
value = record.env.cache.get(record, self)
File "/home/lucas/Documents/work/odoo/odoo12/odoo/odoo/api.py", line 1052, in get
raise CacheMiss(record, field)
odoo.exceptions.CacheMiss: ('sale.order.line(103,).currency_id', None)

保存订单后的错误截图

已尝试在继承模型中重建currency_id字段,但问题未解决。


问题原因

这个CacheMiss错误的核心是:系统缓存中仍保留着已被删除的sale.order.line记录(ID 103)的引用,在订单保存后的字段重计算环节,系统尝试访问该已删除记录的currency_id字段,导致缓存查找失败。具体诱因可能包括:

  1. 自定义模块vz_sale的write方法逻辑存在漏洞,删除订单行后未正确清理相关引用,导致缓存残留无效记录
  2. 第三方模块ks_dashboard_ninja对Base模型write方法的扩展干扰了Odoo标准的缓存失效机制
  3. 依赖currency_id的计算字段未过滤已删除记录,重计算时错误访问无效数据

解决方案

1. 检查并修复自定义模块逻辑

打开vz_sale/models/sale.py中第482行的write方法,确认:

  • 调用super().write()前后是否有处理订单行的代码,是否存在未清理的旧行引用
  • 删除订单行后,确保没有保留对已删除记录的变量引用,避免后续重计算时访问无效数据

2. 强制刷新缓存

  • 在Odoo后台进入设置 > 技术 > 数据库结构 > 字段,搜索sale.order.line模型的currency_id字段,点击重新计算按钮,强制刷新该字段的缓存
  • 或在Python控制台执行以下代码手动清理缓存:
env = self.env
# 全局清理缓存
env.invalidate_all()
# 仅清理sale.order.line的currency_id缓存
env['sale.order.line'].invalidate_cache(fnames=['currency_id'])

3. 排查第三方模块干扰

临时禁用ks_dashboard_ninja模块,测试保存订单是否正常。如果禁用后问题解决,需检查该模块的Base模型write方法实现,确保它正确调用父类方法且未破坏缓存失效流程。

4. 修复计算字段逻辑

如果有自定义字段依赖currency_id,需在计算方法中先过滤已删除记录:

@api.depends('currency_id')
def _compute_custom_field(self):
    # 仅保留存在的记录
    valid_lines = self.exists()
    for line in valid_lines:
        line.custom_field = line.currency_id.some_attribute

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:29:49