如何为Characters模型的licensor_brand配置跨模型匹配Domain
Odoo跨模型字段Domain配置方案
需求明确
需要给santex.characters模型的licensor_brand字段配置Domain,仅显示满足以下条件的santex.licensor_brands记录:其licensor_brands字段关联的res.partner,同时存在于santex.license_contracts模型的licensor_contracts字段关联的伙伴列表中。
正确Domain写法
写法一:字符串静态Domain
直接用Odoo支持的子查询语法实现跨模型匹配:
licensor_brand = fields.Many2one( "santex.licensor_brands", domain="[('licensor_brands', 'in', (select licensor_contracts from santex_license_contracts))]" )
写法二:Lambda动态Domain
适合需要动态计算过滤条件的场景(比如结合上下文权限、状态筛选):
licensor_brand = fields.Many2one( "santex.licensor_brands", domain=lambda self: [ ('licensor_brands', 'in', self.env['santex.license_contracts'].search([]).mapped('licensor_contracts').ids) ] )
写法说明
- 字符串语法:直接通过SQL子查询提取
santex_license_contracts表中所有licensor_contracts对应的伙伴ID,作为licensor_brands字段的匹配范围。 - Lambda语法:通过Odoo ORM查询所有合同记录,用
mapped提取关联伙伴的ID列表,动态生成Domain条件,灵活性更强。
原写法的问题
你尝试的[(santex.licanse_contracts.licensor_contracts), = ,(santex.licensor_brands.licensor_brands)]存在三个核心错误:
- 语法格式错误:Odoo Domain的标准格式是
[(字段名, 操作符, 值)],不能直接跨模型写字段路径,必须用子查询或ID集合匹配。 - 拼写错误:
licanse_contracts应为license_contracts,模型名称拼写错误会导致无法识别。 - 逻辑错误:直接对比两个模型的字段无法建立关联,必须先从第三个模型提取有效ID集合,再做匹配。
扩展优化示例
如果需要仅筛选状态为生效的合同对应的伙伴,可以在Lambda写法中添加过滤条件:
domain=lambda self: [ ('licensor_brands', 'in', self.env['santex.license_contracts'].search([('state', '=', 'active')]).mapped('licensor_contracts').ids) ]
内容的提问来源于stack exchange,提问作者Selman Faruk Yılmaz
相关产品推荐
相关产品推荐

