如何在 OpenERP/Odoo 上设置这个特定域?

How to set this specific domain on OpenERP/Odoo?

我在 Odoo 中有下一个 table,名为关系,它来自 table 女孩和 table 男孩之间的关系:

| girl_id | boy_id | relationship_type |

| 1 | 2 |朋友 |

| 1 | 3 |兄弟姐妹 |

| 2 | 7 |恋人 |

所以:

场景:

在女孩和男孩的形式中存在场关系。当我为女孩或男孩添加新关系时,会打开一个表格来填写 table 关系(girl_id、boy_id 和 relationship_type)的字段。假设我是一个女孩,我点击添加新关系,然后打开了表格。我这样做是为了不看到 girl_id(它是不可见的,但它包含当前女孩的 ID)。所以我只能看到两个字段(boy_id 和 relationship_type)。

我想要的:

继续这个例子,如果我打开 boy_id 的下拉列表,我会看到所有男孩,甚至是那些已经与这个女孩有血缘关系的男孩。例如,如果我给 id 为 1 的女孩添加关系,我不能看到 id 为 2 和 3 的男孩,如果女孩是 id 2 的那个,我不能看到 id 为 7 的男孩。

我的尝试

我在 table 关系中创建了两个字段,名为 boys_of_the_girl(one2many 与 'girl_id.relationships' 相关)和 girls_of_the_boy(one2many 与 [=92= 相关) ]).

我的代码:(示例:为女孩建立关系)

<field name="girl_id" invisible="1"/>
<field name="boys_of_the_girl" invisible="1"/>
<field name="boy_id" domain="[('id', 'not in', boys_of_the_girl)]"/>
<field name="relationship_type"/>

错误:

RuntimeError: 调用 Python 对象时超出最大递归深度

有人能帮帮我吗?谢谢!

编辑

Table 男孩

relationships = fields.One2many(comodel_name='relationship',
                                inverse_name='boy_id',
                                string='Relationships')

Table 女孩

relationships = fields.One2many(comodel_name='relationship', inverse_name='girl_id', string='Relationships')

Table 关系

boy_id = fields.Many2one(comodel_name='boy', string='Boy', required=True)
girl_id = fields.Many2one(comodel_name='girl', string='Girl', required=True)
relationship_type = fields.Char(string='Relationship type')

嗯,最后我发现通过 XML 代码无法管理这个,但可以通过 Python:

达到同样的目的

只有这个功能(和另一个类似girl_id域的另一种形式):

@api.onchange('girl_id')
def on_change_girl_id(self):
    current_girl_id = self.env.context.get('default_girl_id', False)
    relationship_recordset = self.search([('girl_id', '=', current_girl_id)])
    boy_recordset = relationship_recordset.mapped('boy_id')
    boy_ids = boy_recordset.mapped('id')
    boy_id_domain = [
        ('id', 'not in', boy_ids)
    ]
    result = {
        'domain': {
            'boy_id': boy_id_domain,
        },
    }
    return result

这样就不需要在 XML 表单的 boy_id 字段中添加任何域。这个函数会影响你为女孩设置关系的形式,正如我上面写的,必须声明另一个类似的函数来管理为男孩设置关系时的正确行为。