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

如何在Odoo 10中修改自定义模块里noupdate="1"的XML记录

搞定Odoo中noupdate="1"规则的失效问题

嘿,我太懂你遇到的这个麻烦了!Odoo里把记录放在noupdate="1"的<data>标签里时,常规的XML更新操作会直接被忽略,所以要让task_visibility_rule失效,得绕个小弯子分两步来操作:

步骤1:先解锁目标规则的「不可更新」限制

首先得打破原记录的“更新锁”,我们可以在自定义模块的XML里调用ir.model.data的写入方法,把对应记录的noupdate字段改成False,这样后续就能正常修改规则了。

直接上能用的代码:

<odoo>
    <data>
        <!-- 找到project模块里task_visibility_rule对应的ir_model_data记录,修改noupdate属性 -->
        <function model="ir.model.data" name="write">
            <function model="ir.model.data" name="search" eval="[('module', '=', 'project'), ('name', '=', 'task_visibility_rule')]"/>
            <value eval="{'noupdate': False}"/>
        </function>

        <!-- 现在可以正常更新规则,把它置为失效状态 -->
        <record id="project.task_visibility_rule" model="ir.rule">
            <field name="active" eval="False"/>
        </record>
    </data>
</odoo>

步骤2:模块配置的小细节

  • 记得在你的自定义模块的__manifest__.py里,把project加到depends列表里,确保模块加载顺序正确,能找到目标规则。
  • 升级自定义模块后,Odoo会先解锁目标规则的不可更新属性,再把它的active字段设为False,这样就能成功让规则失效了。

备选方案:用Python钩子实现(灵活性更高)

如果你更喜欢用代码控制整个流程,也可以在自定义模块的初始化钩子里面做这件事:

from odoo import api, SUPERUSER_ID

def post_init_hook(cr, registry):
    env = api.Environment(cr, SUPERUSER_ID, {})
    # 定位到目标规则的ir_model_data记录
    ir_data_rec = env['ir.model.data'].search(
        [('module', '=', 'project'), ('name', '=', 'task_visibility_rule')],
        limit=1
    )
    if ir_data_rec:
        # 解锁不可更新属性
        ir_data_rec.write({'noupdate': False})
        # 获取规则记录并置为失效
        task_rule = env['ir.rule'].browse(ir_data_rec.res_id)
        task_rule.write({'active': False})
        # 可选:如果担心后续原模块更新覆盖设置,可以改回noupdate=True
        # ir_data_rec.write({'noupdate': True})

把这段代码放到模块的__init__.py里,升级模块时就会自动执行啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:00:30