Odoo:从 many2one 访问一个列
Odoo : Acces a column from many2one
这是我的问题:
我在模型 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),
}
-res.partner 在带有 model3 的模块中:
class res_partner:
_inherit = res.partner
_columns = {
'model3_id': fields.many2one('model3',
u'Model3'
track_visibility='onchange',
select=True),
}
model3 在这里并不重要,我有 10 个 id 的 model3 对象,我需要能够影响,例如,id“2”到 res.partner 中的 'model3_id' 当 "type"在model1中修改。
我试过这个: 通过这样做:
@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 不存在。我试图找到此错误的答案,但 none 与我的代码匹配。
我查看了数十个主题,整个上午都在尝试修复它,但无论我做什么,都行不通。 (我做的第一件事 - 出现在我写的第一个 class 中 - 没有给我任何错误,但在数据库中没有任何改变。)
感谢阅读以及您能提供的任何帮助。
编辑:我认为这里唯一真正的问题是 "How to give an ID as a value for a many2one?" 但我不确定这是这里唯一的问题所以我让所有的文本。
我终于解决了我的问题:
当您创建一个 onchange 时,它似乎只会更改 javascript,如果您尝试修改的字段(由于其他字段上的 onchange)不在您的树中,它不会改变。我发现了什么,在查看 phppgadmin 时做了一些尝试:
- 当您更改字段时,它会更新 javascript,数据库中什么也没有做。
- 保存更改后,javascript 接缝会分析字段并用这些字段更新数据库。
所以当某些东西不在 xml 中时,您不能对其使用 onchange。如果您想更改另一个模型或模块中的某些内容,那将是一件非常痛苦的事情。但更重要的是,尝试这个真的很愚蠢,但它完全有道理:onchange 的目的是在完成任何注册之前更新,唯一的兴趣是在你仍在修改它的同时显示它。
由于 Odoo 8.0 API,解决方案非常简单。这是一个例子(这是资源合作伙伴):
'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'(去掉还是修改)
对于 openerp-7 它是 'fields.function'(以 type='many2one' 作为参数和 store={('model1':_other_function, [ 'type'], 10)}但是我没有这样写完,所以就不展示了
这是我的问题:
我在模型 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),
}
-res.partner 在带有 model3 的模块中:
class res_partner:
_inherit = res.partner
_columns = {
'model3_id': fields.many2one('model3',
u'Model3'
track_visibility='onchange',
select=True),
}
model3 在这里并不重要,我有 10 个 id 的 model3 对象,我需要能够影响,例如,id“2”到 res.partner 中的 'model3_id' 当 "type"在model1中修改。
我试过这个:
@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 不存在。我试图找到此错误的答案,但 none 与我的代码匹配。
我查看了数十个主题,整个上午都在尝试修复它,但无论我做什么,都行不通。 (我做的第一件事 - 出现在我写的第一个 class 中 - 没有给我任何错误,但在数据库中没有任何改变。)
感谢阅读以及您能提供的任何帮助。
编辑:我认为这里唯一真正的问题是 "How to give an ID as a value for a many2one?" 但我不确定这是这里唯一的问题所以我让所有的文本。
我终于解决了我的问题:
当您创建一个 onchange 时,它似乎只会更改 javascript,如果您尝试修改的字段(由于其他字段上的 onchange)不在您的树中,它不会改变。我发现了什么,在查看 phppgadmin 时做了一些尝试:
- 当您更改字段时,它会更新 javascript,数据库中什么也没有做。
- 保存更改后,javascript 接缝会分析字段并用这些字段更新数据库。
所以当某些东西不在 xml 中时,您不能对其使用 onchange。如果您想更改另一个模型或模块中的某些内容,那将是一件非常痛苦的事情。但更重要的是,尝试这个真的很愚蠢,但它完全有道理:onchange 的目的是在完成任何注册之前更新,唯一的兴趣是在你仍在修改它的同时显示它。
由于 Odoo 8.0 API,解决方案非常简单。这是一个例子(这是资源合作伙伴):
'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'(去掉还是修改)
对于 openerp-7 它是 'fields.function'(以 type='many2one' 作为参数和 store={('model1':_other_function, [ 'type'], 10)}但是我没有这样写完,所以就不展示了