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

Odoo 16如何清除缓存?expected_delivery字段不更新问题排查

解决产品网格中expected_delivery字段缓存不更新的问题

核心问题分析

你的计算字段没有配置正确的依赖关系——Odoo的计算字段默认会缓存计算结果,只有当依赖的字段发生变化时,才会自动触发重新计算。同时当前代码的查询逻辑效率极低,全量遍历所有采购订单的方式不仅性能差,还容易出现数据匹配错误。

修复方案

1. 为计算字段添加依赖装饰器

在计算方法上方添加@api.depends,指定关联的依赖字段。这样当采购订单的date_planned或采购订单行的关联产品变化时,Odoo会自动重新计算字段值,从根源解决缓存不更新的问题:

from odoo import api, fields, models

class ProductProduct(models.Model):
    _inherit = 'product.product'

    expected_delivery = fields.Date(string='Expected Delivery', compute='_compute_expected_delivery')

    @api.depends('purchase_order_line_ids.order_id.date_planned')
    def _compute_expected_delivery(self):
        # 批量获取产品对应的最新采购订单日期
        product_date_map = {}
        # 通过采购订单行关联产品,仅查询当前对象涉及的产品数据
        order_lines = self.env['purchase.order.line'].search([
            ('product_id', 'in', self.ids)
        ]).sorted(lambda line: line.order_id.date_planned, reverse=True)
        
        for line in order_lines:
            prod_id = line.product_id.id
            if prod_id not in product_date_map:
                product_date_map[prod_id] = line.order_id.date_planned.date()
        
        # 为每个产品赋值
        for product in self:
            product.expected_delivery = product_date_map.get(product.id, False)

2. 移除无效的缓存清理代码

原代码中在计算方法内调用的product.invalidate_cache()和self.env['product.template'].invalidate_cache()完全无效,还会额外消耗性能。compute方法本身负责计算字段值,缓存会在计算完成后自动更新,无需手动清理。

3. 优化数据匹配逻辑

抛弃原代码中通过产品名称+默认编码匹配的方式,改用product_id直接关联采购订单行,彻底避免名称重复导致的匹配错误,同时大幅提升查询效率。

可选:强制网格刷新(按需使用)

如果需要确保每次进入产品网格都强制加载最新数据,可以在产品列表的动作配置中添加context={'force_refresh': True},不过配置正确的依赖后,通常无需此操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:00:06