2015-04-01 99 views
0

我有Odoo中的下一张桌子,名为关系,它来自桌子女孩和桌子男孩之间的关系:如何在OpenERP/Odoo上设置这个特定的域名?

| girl_id | boy_id | relationship_type |

| 1 | 2 |朋友|

| 1 | 3 |兄弟姐妹|

| 2 | 7 |恋人|

所以:

  • 在表中的女孩有一个领域的关系是指向表关系的one2many 。
  • 在表格男孩中,有一个字段关系,它是指向表关系的一个文件夹 。
  • 在表格关系中有两个字段,分别指向表女孩和男孩的两个字段,girl_id和boy_id, 。

场景:

在女孩和男孩的形式有外地的关系。当我为女孩或男孩添加新的关系时,会打开表单以填充表关系的字段(girl_id,boy_id和relationship_type)。想象一下,我是一个女孩的形式,我点击添加一个新的关系,并打开表格。我实现了这个目的是为了不看到girl_id(它是不可见的,但它包含了当前女孩的ID)。所以我只能看到两个字段(boy_id和relationship_type)。

我想要什么:

保持与上例中,如果我打开boy_id的下拉列表中,我会看到所有的男孩,甚至谁已经涉及到这个女孩的人。例如,如果我为ID为1的女孩添加关系,我不会看到带有ID 2和ID 3的男孩,如果女孩是ID 2的男孩,我不会看到ID为7的男孩。

我尝试

我在表关系创建了两个领域,一个名为boys_of_the_girl(one2many有关 'girl_id.relationships')和girls_of_the_boy(one2many有关 'boy_id.relationships')。

我的代码:(实施例:创建一个女孩的关系)

<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对象最大递归深度超过

任何人都可以帮助我吗?谢谢!

编辑

男孩

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

女孩

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

ŧ能够关系

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') 
+0

我认为你需要采取many2many而不是one2many,而m2m默认提供了你想要的。 – 2015-04-01 09:14:51

+0

谢谢@EmiproTechnologies。但是many2many字段只生成一个只包含外部标识的表,不可能添加更多列(例如,在这种情况下,relationship_type) – forvas 2015-04-01 11:00:52

+0

您能向我展示所有这些模型的字段结构吗? – 2015-04-01 12:10:51

回答

1

好了,终于我发现这是不可能通过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。正如我在上面写的那样,这个函数将影响你为女孩设定关系的形式,在为男孩设定关系时,必须声明另一个类似的函数来管理正确的行为。