何时在 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)

何时使用:

  1. 如果您使用@api.one,returned 值在列表中。 Web 客户端并不总是支持这一点,例如按钮动作 方法。 在这种情况下,您应该使用 @api.multi 来装饰您的方法,并且可能会调用 self.ensure_one() 方法定义。

  2. 最好将@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