Odoo用户自定义筛选器:筛选关联state='open'合同的res.partner
搞定Odoo里One2many字段的状态筛选问题
嘿,这个坑我之前踩过!你遇到的问题是Odoo处理One2many字段Domain的特殊逻辑——直接用contract_ids.state会要求所有关联合同的状态都是'open',而不是你想要的「存在至少一个状态为open的合同」。下面给你两种可行的解决办法:
方案1:用exists操作符(推荐,简洁又直观)
在自定义筛选器的Domain里直接用exists操作符,它专门用来检查关联字段是否存在满足子条件的记录:
[('contract_ids', 'exists', [('state', '=', 'open')])]
这个写法的意思很明确:筛选出那些至少有一个关联合同状态是'open'的合作伙伴,完全匹配你的需求。
方案2:反向关联子查询(兼容旧版本Odoo)
如果你的Odoo版本比较老,不支持exists操作符,可以用反向查询的方式,从合同模型倒推合作伙伴:
[('id', 'in', 'contract.contract', [('state', '=', 'open')], 'partner_id')]
这个Domain的逻辑是:先在合同模型里找出所有状态为'open'的记录,然后取这些记录关联的partner_id,最后筛选出ID在这个集合里的合作伙伴。
为啥你之前的写法不行?
你试的['&', ('contract_ids', '!=', False), ('contract_ids.state', '=', 'open')],Odoo会把它解析成:
- 合作伙伴必须有至少一个合同
- 所有关联合同的状态都得是'open'
这和你要的「只要有一个合同是open就行」的逻辑完全相反,所以才会筛选出错误的结果。
内容的提问来源于stack exchange,提问作者user2757902
相关产品推荐
相关产品推荐

