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

如何在Odoo的ir.rule域中调用方法?含自定义记录规则配置疑问

在Odoo ir.rule域中调用自定义方法的实现方案

我来帮你解决这个问题,在Odoo的ir.rule中调用自定义方法其实有明确的规范,我分步骤给你讲清楚:

1. 确定自定义方法的存放位置

你有两个常用的选择,取决于你的业务逻辑:

选项A:放在res.users模型中(推荐,适用于和当前用户关联的逻辑)

如果你的ID列表是基于当前登录用户计算的,把方法放在用户模型里最合理,因为ir.rule里可以直接访问user对象(当前登录用户的记录)。

在你的模块的models/res_users.py文件中添加:

from odoo import models, api

class ResUsers(models.Model):
    _inherit = 'res.users'

    def get_agent_ids(self):
        # 这里替换成你的业务逻辑,返回整数ID的列表
        # 示例:返回当前用户关联的所有agent的ID
        # 注意:如果需要访问用户无权限的数据,要用sudo()提升权限
        return self.sudo().agent_ids.ids

选项B:放在你的目标模型something中

如果逻辑和something模型强相关,也可以把方法放在该模型里:

在models/something.py中添加:

from odoo import models, api

class Something(models.Model):
    _name = 'something'
    _description = 'Your Something Model'

    @api.model
    def get_agent_ids(self):
        # 这里写你的逻辑,比如基于当前用户返回对应ID列表
        # 示例:返回当前用户有权限查看的agent ID
        return self.env.user.sudo().agent_ids.ids

2. 在ir.rule的域中调用方法

根据方法的存放位置,修改你的XML代码:

调用用户模型的方法

<record model="ir.rule" id="ir_rule_something">
    <field name="name">something</field>
    <field name="model_id" ref="model_something"/>
    <!-- 使用user对象调用方法 -->
    <field name="domain_force">[('agent','in', user.get_agent_ids())]</field>
    <field name="perm_read" eval="True"/>
    <field name="perm_write" eval="False"/>
    <field name="perm_unlink" eval="False"/>
    <field name="perm_create" eval="False"/>
</record>

调用目标模型的方法

<record model="ir.rule" id="ir_rule_something">
    <field name="name">something</field>
    <field name="model_id" ref="model_something"/>
    <!-- 使用model()方法获取模型实例,再调用自定义方法 -->
    <field name="domain_force">[('agent','in', model('something').get_agent_ids())]</field>
    <field name="perm_read" eval="True"/>
    <field name="perm_write" eval="False"/>
    <field name="perm_unlink" eval="False"/>
    <field name="perm_create" eval="False"/>
</record>

3. 关键注意事项

  • 权限问题:如果你的方法需要访问当前用户没有权限的数据,一定要用sudo()提升权限,否则会因为权限限制返回空列表,导致规则不生效。
  • 方法返回值:必须确保方法返回的是整数ID的列表,不能是记录集或者其他类型,否则域表达式会报错。
  • 性能优化:ir.rule会在每次查询对应模型时执行,所以方法里的逻辑要尽量简洁,避免复杂的数据库查询,防止影响系统性能。
  • 装饰器使用:如果方法放在目标模型中,必须添加@api.model装饰器,因为这是模型级别的方法,不需要绑定到特定的记录集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:45:19