odoo计算字段如果是store=True存在数据库中的,不通过depends绑定的字段变化去触发计算,又想让计算字段重新计算一次值的时候,可以使用如下两种方法触发重新计算
原理: 两种方法的原理都是通过api.py中定义的add_todo和recompute()方法触发字段的重新计算,
add_todo函数的第一个参数需要传入一个字段对象,第二个参数是需要重新计算的记录
推荐方法3
方法1: odoo脚本运行模式,即odoo shell模式
>>> model = env['模型名称']
>>> env.add_todo(model._fields['计算字段名'], model.search([]))
>>> model.recompute()
>>> env.cr.commit()
方法2: 定义一个动作去调用后端代码,触发recompute
动作代码:
<record id="动作id" model="ir.actions.server">
<field name="name">更新部门全称</field>
<field name="model_id" ref="model_模型名"/>
<field name="binding_model_id" ref="model_模型名"/>
<field name="state">code</field>
<field name="is_button">False</field>
<field name="code">
action = model.recompute_compute_field()
</field>
</record>
后端代码:
@api.multi
def recompute_compute_field(self):
"""
触发重新计算完整名称
"""
model = self.env['计算字段所在模型名']
self.env.add_todo(model._fields['计算字段名'], self.search([]))
model.recompute()
self._cr.commit()
方法3: 在系统中定义一个定时任务手动执行触发计算字段重新计算,好处是用户无法在动作中看到,避免误操作
在系统中打开debug模式,在设置菜单->技术->动作->安排的动作中新建一条记录, 调用方法2中写的后端方法, 然后保存点击立即执行按钮
注意: 定时任务不要把右上角的激活打开, 不然会频繁执行, 造成服务器负担, 执行完可以将定时任务删除
如图: