Openerp Odoo:it访问字段';s名称(以字符串形式给出)

Openerp Odoo:it访问字段';s名称(以字符串形式给出),openerp,Openerp,我有一个模型,在这里我想访问一个由字符串给出的字段。例如: def test(self): field = 'name' name = getattr(self, field) 这工作正常-name设置为self.name。但我想访问一个相关字段: def test2(self): field = 'partner_id.name' name = getattr(self, field) 这不起作用(因为“partner_id.name”在self上不存在)。

我有一个模型,在这里我想访问一个由字符串给出的字段。例如:

def test(self):
    field = 'name'
    name = getattr(self, field)
这工作正常-name设置为self.name。但我想访问一个相关字段:

def test2(self):
    field = 'partner_id.name'
    name = getattr(self, field)

这不起作用(因为“partner_id.name”在self上不存在)。你知道怎么做吗?

getattr
不支持点表示法,只支持简单的属性名称。但是,您可以创建一个简单的函数,该函数可以:

def getfield(model, field_name):
    value = model
    for part in field_name.split('.'):
        value = getattr(value, part)
    return value
您可以这样使用它:

def test2(self):
    field = 'partner_id.name'
    name = getfield(self, field)

getattr
不支持点表示法,只支持简单的属性名称。但是,您可以创建一个简单的函数,该函数可以:

def getfield(model, field_name):
    value = model
    for part in field_name.split('.'):
        value = getattr(value, part)
    return value
您可以这样使用它:

def test2(self):
    field = 'partner_id.name'
    name = getfield(self, field)

您需要使用包含
partner\u id.name

def test2(self):
    field = 'name'
    object = self.pool.get('res.partner').browse(cr, uid, self.partner_id.id)#v7
    #object = self.env['res.partner'].browse(self.partner_id.id)#v8
    name = getattr(object, field)

您需要使用包含
partner\u id.name

def test2(self):
    field = 'name'
    object = self.pool.get('res.partner').browse(cr, uid, self.partner_id.id)#v7
    #object = self.env['res.partner'].browse(self.partner_id.id)#v8
    name = getattr(object, field)

我还遇到了另一个受邮件模板系统启发的解决方案:

from openerp.tools.safe_eval import safe_eval as eval

def test2(self):
    field = 'partner_id.name'
    field = 'object.' + field
    name = eval(field, {'object': self})

我还遇到了另一个受邮件模板系统启发的解决方案:

from openerp.tools.safe_eval import safe_eval as eval

def test2(self):
    field = 'partner_id.name'
    field = 'object.' + field
    name = eval(field, {'object': self})

请注意,如果
字段
是用户提供的值,则这可能会带来严重的安全隐患。通常,使用
eval
时需要格外小心。请注意,如果
字段
是用户提供的值,则这可能会带来严重的安全隐患。一般来说,使用
eval
时需要格外小心。