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

XML中如何通过父类列表过滤Many2one子字段及domain配置问题

Q1: 如何在XML中通过父类的列表过滤Many2one类型的子字段?

假设你在处理Odoo这类ERP系统的视图配置,当父记录包含列表型字段(比如One2many或Many2many),想要限制子表单中Many2one字段的可选值时,核心是用parent关键字访问父记录,再通过mapped()提取列表里的目标字段集合,最后在domain中用in匹配。

举个实际场景例子:

  • 父模型有一个One2many字段order_lines,关联到子模型order.line
  • 子模型的Many2one字段product_id需要过滤,只能选择父记录order_lines中已出现过的产品

XML视图里的写法如下:

<field name="order_lines">
    <tree>
        <field name="product_id" domain="[('id', 'in', parent.order_lines.mapped('product_id').ids)]"/>
        <!-- 其他子字段 -->
    </tree>
</field>

关键点拆解:

  • parent.order_lines:直接访问父记录的One2many列表数据
  • mapped('product_id'):从列表的每条子记录中提取product_id,得到一个记录集
  • .ids:把记录集转换成ID列表,满足in操作符的格式要求
Q2: 父类field1是Many2one、子类field2是Many2one时,如何正确使用domain过滤?

你提到的domain="[('field2','in',parent.field1)]"存在小问题:parent.field1是单个Many2one记录,而in操作符需要的是列表/记录集这类可迭代对象,直接写会触发语法错误。正确写法分两种场景:

场景1:要求field2严格等于父类的field1

直接用=操作符即可,配合记录ID(Odoo也支持直接传入记录对象,会自动解析ID):

<!-- 父视图中的One2many字段容器 -->
<field name="child_records">
    <form>
        <!-- 子字段field2的过滤规则 -->
        <field name="field2" domain="[('id', '=', parent.field1.id)]"/>
        <!-- 更简洁的写法,Odoo会自动处理记录到ID的转换 -->
        <!-- <field name="field2" domain="[('id', '=', parent.field1)]"/> -->
    </form>
</field>

场景2:field2关联模型与field1关联模型有一对多/多对多关系

比如父类field1是Many2one到res.partner,子类field2是Many2one到res.partner.contact,而res.partner有contacts字段关联到res.partner.contact,这时可以这样写:

<field name="field2" domain="[('id', 'in', parent.field1.contacts.ids)]"/>

补充:如果一定要用in怎么办?

可以把单个记录包装成列表,虽然没必要,但写法是这样的:

<field name="field2" domain="[('id', 'in', [parent.field1.id])]"/>

不过更推荐用=,逻辑更清晰也更高效。


内容的提问来源于stack exchange,提问作者a.CHOURAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:13:05