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字段,导致缓存查找失败。具体诱因可能包括:
- 自定义模块
vz_sale的write方法逻辑存在漏洞,删除订单行后未正确清理相关引用,导致缓存残留无效记录 - 第三方模块
ks_dashboard_ninja对Base模型write方法的扩展干扰了Odoo标准的缓存失效机制 - 依赖
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
相关产品推荐
相关产品推荐

