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

Odoo中能否实现域的‘contains’运算符(‘in’的逆运算)?

解决Odoo中Many2many字段的反向过滤问题

我之前在Odoo开发中完全遇到过相同的场景——当把原本的Many2one用户字段改成Many2many后,需要调整过滤器来匹配“当前用户是否在关联集合中”的需求。其实你不需要假设的contains运算符,Odoo本身就支持这种反向匹配,下面是几个可行的解决思路:

方法1:直接使用in运算符(最简单)

Odoo的domain语法中,对于Many2many字段,使用in运算符并传入当前用户ID的列表,就可以实现“字段包含该用户”的效果。你只需要把过滤器的domain改成:

<filter string="My Tasks" name="my_tasks" domain="[('user_ids','in',[uid])]"/>

这个写法的原理是:Odoo会自动解析Many2many字段的关联关系,生成SQL查询来检查当前用户的ID是否存在于user_ids关联的记录集合中,完全符合你要的“contains”效果。

方法2:使用exists()进行更明确的过滤

如果后续需要结合其他复杂条件,也可以用Odoo的exists()方法来构造domain,逻辑表达更直观:

<filter string="My Tasks" name="my_tasks" domain="[('user_ids','exists',[('id','=',uid)])]"/>

这种写法明确表达了“存在一条user_ids关联记录,其ID等于当前用户”的判断逻辑,适合需要扩展过滤条件的场景。

方法3:自定义计算字段(复杂场景适配)

如果上述方法都无法满足你的特殊需求(比如需要跨模型关联的复杂判断),可以在project.task模型中添加一个计算字段来实现:

  1. 先在模型里定义布尔计算字段:
is_my_task = fields.Boolean(compute='_compute_is_my_task', string='Is My Task')

def _compute_is_my_task(self):
    current_user = self.env.user
    for task in self:
        task.is_my_task = current_user in task.user_ids
  1. 然后在视图中用这个字段做过滤器:
<filter string="My Tasks" name="my_tasks" domain="[('is_my_task','=',True)]"/>

这个方法的优势是可以自定义任意复杂的判断逻辑,但要注意计算字段会消耗一定性能,更适合数据量不大的业务场景。

另外提一句,你设置的default=lambda self: self.env.user.mapped('id')可以简化为default=lambda self: [(6, 0, [self.env.user.id])],这是Odoo中Many2many字段设置默认值的标准写法,效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:27:05