何时在 odoo 中使用 api.one 和 api.multi |开放者?
When to use api.one and api.multi in odoo | openerp?
最近发布了odoo(原OpenERP)V8。在新的 API 方法中引入了装饰器。在 models.py
方法中需要用 @api.one
或 @api.multi
.
修饰
参考 odoo documentation 我无法确定确切用途。谁能详细解释一下。
谢谢。
通常两个装饰器都用于装饰记录式方法,其中“self
”包含 recordset(s)。让我简要解释一下何时使用 @api.one
和 @api.multi
:
1. @api.one
:
装饰一个记录风格的方法,其中'self'应该是一个单例实例。
装饰方法自动循环记录(即,它为记录集中的每条记录调用该方法),生成一个包含结果的列表。
如果方法用@returns 装饰,它会连接生成的实例。这样的方法:
@api.one
def 方法(自我,参数):
returnself.name
可以在记录和传统风格中调用,如::
# recs = model.browse(cr, uid, ids, context)
names = recs.method(args)
names = model.method(cr, uid, ids, args, context=context)
- 每次'self'重新定义为当前记录
2. @api.multi
:
装饰一个记录式方法,其中“self
”是一个记录集。该方法通常定义对记录的操作。这样的方法:
@api.multi
def 方法(self, args):
可以在记录和传统风格中调用,如::
# recs = model.browse(cr, uid, ids, context)
recs.method(args)
model.method(cr, uid, ids, args, context=context)
何时使用:
如果您使用@api.one,returned 值在列表中。
Web 客户端并不总是支持这一点,例如按钮动作
方法。
在这种情况下,您应该使用 @api.multi 来装饰您的方法,并且可能会调用 self.ensure_one()
方法定义。
最好将@api.multi 与self.ensure_one() 一起使用而不是@api.one 以避免return 值中的副作用。
@api.one:
此装饰器会自动为您在 RecordSet 的 Records 上循环。自己被重新定义为当前记录:
@api.one
def func(self):
self.name = 'xyz'
@api.multi:
Self 将是没有迭代的当前 RecordSet。这是默认行为:
@api.multi
def func(self):
len(self)
所有API的详细说明可以参考这个Link
@api.model #When the record data/self is not as relevant. Sometimes also used with old API calls.
def model_text(self):
return "this text does not rely on self"
@api.multi #Normally followed by a loop on self because self may contain multiple records
def set_field(self):
for r in self:
r.abc = r.a + r.b
@api.one #The api will do a loop and call the method for each record. Not preferred because of potential problems with returns to web clients
def set_field(self):
self.abc = self.a + self.b
最近发布了odoo(原OpenERP)V8。在新的 API 方法中引入了装饰器。在 models.py
方法中需要用 @api.one
或 @api.multi
.
参考 odoo documentation 我无法确定确切用途。谁能详细解释一下。
谢谢。
通常两个装饰器都用于装饰记录式方法,其中“self
”包含 recordset(s)。让我简要解释一下何时使用 @api.one
和 @api.multi
:
1. @api.one
:
装饰一个记录风格的方法,其中'self'应该是一个单例实例。
装饰方法自动循环记录(即,它为记录集中的每条记录调用该方法),生成一个包含结果的列表。
如果方法用@returns 装饰,它会连接生成的实例。这样的方法:
@api.one def 方法(自我,参数): returnself.name
可以在记录和传统风格中调用,如::
# recs = model.browse(cr, uid, ids, context)
names = recs.method(args)
names = model.method(cr, uid, ids, args, context=context)
- 每次'self'重新定义为当前记录
2. @api.multi
:
装饰一个记录式方法,其中“
self
”是一个记录集。该方法通常定义对记录的操作。这样的方法:@api.multi def 方法(self, args):
可以在记录和传统风格中调用,如::
# recs = model.browse(cr, uid, ids, context)
recs.method(args)
model.method(cr, uid, ids, args, context=context)
何时使用:
如果您使用@api.one,returned 值在列表中。 Web 客户端并不总是支持这一点,例如按钮动作 方法。 在这种情况下,您应该使用 @api.multi 来装饰您的方法,并且可能会调用 self.ensure_one() 方法定义。
最好将@api.multi 与self.ensure_one() 一起使用而不是@api.one 以避免return 值中的副作用。
@api.one:
此装饰器会自动为您在 RecordSet 的 Records 上循环。自己被重新定义为当前记录:
@api.one
def func(self):
self.name = 'xyz'
@api.multi:
Self 将是没有迭代的当前 RecordSet。这是默认行为:
@api.multi
def func(self):
len(self)
所有API的详细说明可以参考这个Link
@api.model #When the record data/self is not as relevant. Sometimes also used with old API calls.
def model_text(self):
return "this text does not rely on self"
@api.multi #Normally followed by a loop on self because self may contain multiple records
def set_field(self):
for r in self:
r.abc = r.a + r.b
@api.one #The api will do a loop and call the method for each record. Not preferred because of potential problems with returns to web clients
def set_field(self):
self.abc = self.a + self.b