Odoo:按名称访问字段(以字符串形式给出)
Odoo: Access field by it's name (given as string)
我有一个模型,我想在其中访问一个由字符串给出的字段。示例:
def test(self):
field = 'name'
name = getattr(self, field)
工作正常 - 名称设置为 self.name。但是后来我想访问相关字段:
def test2(self):
field = 'partner_id.name'
name = getattr(self, field)
那是行不通的(因为 'partner_id.name' 自身不存在)。知道如何做对吗?
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_id.name
的object
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})
我有一个模型,我想在其中访问一个由字符串给出的字段。示例:
def test(self):
field = 'name'
name = getattr(self, field)
工作正常 - 名称设置为 self.name。但是后来我想访问相关字段:
def test2(self):
field = 'partner_id.name'
name = getattr(self, field)
那是行不通的(因为 'partner_id.name' 自身不存在)。知道如何做对吗?
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_id.name
object
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})