Odoo:从很多人那里获得一个专栏

时间:2016-05-17 12:18:10

标签: python python-2.7 openerp odoo-8

这是我的问题:

我在模特1:

class model1(osv.osv):
    _name = 'model1'
    _columns = {
        'name': fields.many2one('res.partner',
                                       u'Person',
                                       domain=[('my_boolean', '=', False)],
                                       required=True,
                                       select=True),
        'type' = fields.selection([('1', 'One'),
                                  ('2', 'Two'),
                                  u'Select',
                                  required=True),
     }

    @api.onchange('type')
    def onchange_type_model1(self)
        self.name.model3_id = 2

我想在这个onchange中修改res.partner中model3_id的id的值:

-res.partner在这个模块中:

class res_partner(osv.osv):
    _inherit = 'res.partner'
    _columns = {
        'model1_partner_ids': fields.one2many('model1',
                                                     'name',
                                                     u'asker from model1',
                                                     select=True),
    }
带模型3的模块中的

-res.partner:

class res_partner:
    _inherit = res.partner
    _columns = {
        'model3_id': fields.many2one('model3',
                                            u'Model3'
                                            track_visibility='onchange',
                                            select=True),
    }

model3在这里并不重要,我有10个id的model3对象,当模型1中的“type”被修改时,我需要能够影响res.partner中的id“2”到“model3_id”。

我试过这个:odoo - get value from many2one field这样做:

@api.onchange('type')
def onchange_type_demand(self, cr, uid, ids, context=None):
    for name in self.browse(cr, uid, ids, context=context):
        if name.model3_id:
            name.model3_id = 2

但它给我一个错误,说record.env不存在。我试图找到这个错误的答案,但没有一个与我的代码匹配。

我查看了几十个主题,整个上午都试着修复它,但无论我做什么,它都行不通。 (我做的第一件事 - 出现在我写的第一堂课 - 没有给我任何错误,但在数据库中没有任何改变。)

感谢阅读和您提供的任何帮助。

编辑:我认为这里唯一真正的问题是“如何将ID作为一个人的价值?”但我不确定这是唯一的问题,所以我让所有的文字。

1 个答案:

答案 0 :(得分:1)

我终于解决了我的问题:

当你创建一个onchange时,它会断开它只会更改javascript,如果你试图修改的字段,由于其他字段的onchange,不在你的树中,它会赢得'改变。我想到了,在看phppgadmin时做了一些尝试:

  • 当您更改字段时,它会更新javascript,数据库中没有任何操作。
  • 保存更改后,javascript会分析这些字段并使用这些字段更新数据库。

因此,当某些内容不在xml中时,您无法在其上使用onchange。如果你想改变另一个模型或模块中的某些东西,这真的很痛苦。但更多的是尝试这一点真是太愚蠢而且它完全有道理:onchange的目的是在任何注册完成之前更新,唯一的兴趣是在你仍然修改它时显示它。

由于Odoo 8.0 API,解决方案非常简单。这是一个例子(这是在res合作伙伴):

'my_field': field.many2one(compute='_compute_second_field', store=True, readonly=True)

@api.depends('name_ids.type') #name_ids is the one2many reverse of name's many2one in model1
for record in self:
    if self.name_ids: #if some names are pointing to this, name_ids is not empty
        record.model3_id = 2
    else: #if doesn't exist, default value 
        record.model3_id = 0

因此,当您在res_partner中创建时,此res_partner仍然不在model1中,取值' 0'。然后在model1中添加它,取值2.如果从model1中删除它,请取值' 0' 0再次(删除仍然是一个修改)。

对于openerp-7来说,它是' fields.function' (使用type =' many2one'作为参数和store = {(' model1':_ other_function,[' type'],10)}但我没有'我设法以这种方式完成它,所以我不会显示它