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

如何为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)
    ]
)

写法说明

  1. 字符串语法:直接通过SQL子查询提取santex_license_contracts表中所有licensor_contracts对应的伙伴ID,作为licensor_brands字段的匹配范围。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:43:13