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
相关产品推荐
相关产品推荐

