我在Odoo遇到过one2many字段的奇怪行为。
这是我的代码:
models.py:
class mrp_bom_inherit(models.Model):
_inherit = 'mrp.bom'
producten_tussenmodel = fields.One2many(comodel_name='tussenmodel_wc_producten', inverse_name='bom_id', string="producten", copy=True)
class tussenmodel_wc_producten(models.Model):
bom_id = fields.Integer()
routing_id = fields.Integer()
producten = fields.Char(string="Productnr.")
views.xml:
<field name="producten_tussenmodel" widget="one2many_list" nolabel="1">
<tree string="Een Naar Veel" editable="bottom">
<field name="producten" domain="[('routing_id', '=', 32)]"/>
</tree>
</field>
这给出了输出:
但它应该只显示&#34; bbb&#34;自&#34; bbb&#34;表tussenmodel_wc_producten中的routing_id = 32是数据库中唯一的记录,表tussenmodel_wc_producten中的bom_id等于mrp.bom中的id。
我已经通过SQL查询检查了这个:
select producten
from mrp_bom as m JOIN tussenmodel_wc_producten as t ON(m.id = t.bom_id)
where t.routing_id = 32
只有输出&#34; bbb&#34;。
我在这里做错了什么?
答案 0 :(得分:1)
domain
属性仅控制可用对象列表中存在哪些对象(即,可能可能为关系选择的对象)当用户编辑表单时。它没有做任何事情,特别是它不能控制关系中实际存在哪些对象。
如果对象已经与“aaa”,“bbb”,“ccc”和“ddd”的关系,设置域将无法做任何改变。
答案 1 :(得分:0)
首先,您需要更新模型中的关系,对于One2many关系,您必须将Many2one字段作为反向字段名称,以便odoo引擎可以正确解释它。
class tussenmodel_wc_producten(models.Model):
bom_id = fields.Many2one('mrp.bom','Bom')
并以这种方式更新您的字段域
<field name="producten_tussenmodel" widget="one2many_list" nolabel="1" domain="[('routing_id', '=', 32)]">
<tree string="Een Naar Veel" editable="bottom">
<field name="producten" />
</tree>
</field>
答案 2 :(得分:0)
一个可能的问题,在你的one2many字段上,反向参数假设指向另一个表上的many2one,即关系的反转,而在上面的代码中,tussenmodel_wc_producten中的bom_id是一个整数。
您应该重新定义为
fields.Many2one(“mrp.bom”,“BOM Id”)
最后一件事; tussenmodel_wc_producten没有为模型定义_name。这是合法的,因为基本模型将默认为class。 name 如果未定义_name,但定义_name或_inherit是惯例。鉴于_name在Odoo模型处理中的重要性,如果没有定义,我不想依赖于所有按预期工作的东西。