When to use api.one and api.multi in odoo | openerp?

BomberMan picture BomberMan · Jan 16, 2015 · Viewed 12.1k times · Source

Recently odoo (formerly OpenERP) V8 has been released. In new API method decorators are introduced. in models.py methods needs to be decorated with @api.one or @api.multi.

Referring odoo documentation i can not determine the exact use. Can anybody explain in detail.

Thanks.

Answer

BomberMan picture BomberMan · Jan 16, 2015

Generally both decoarators are used to decorate a record-style method where 'self' contains recordset(s). Let me explain in brief when to use @api.one and @api.multi:

1. @api.one:

  • Decorate a record-style method where 'self' is expected to be a singleton instance.

  • The decorated method automatically loops on records (i.e, for each record in recordset it calls the method), and makes a list with the results.

  • In case the method is decorated with @returns, it concatenates the resulting instances. Such a method:

    @api.one def method(self, args): return self.name

may be called in both record and traditional styles, like::

# recs = model.browse(cr, uid, ids, context)
names = recs.method(args)

names = model.method(cr, uid, ids, args, context=context)
  • Each time 'self' is redefined as current record.

2. @api.multi:

  • Decorate a record-style method where 'self' is a recordset. The method typically defines an operation on records. Such a method:

    @api.multi def method(self, args):

may be called in both record and traditional styles, like::

# recs = model.browse(cr, uid, ids, context)
recs.method(args)

model.method(cr, uid, ids, args, context=context)

When to use:

  1. If you are using @api.one, the returned value is in a list. This is not always supported by the web client, e.g. on button action methods. In that case, you should use @api.multi to decorate your method, and probably call self.ensure_one() in the method definition.

  2. It is always better use @api.multi with self.ensure_one() instead of @api.one to avoid the side effect in return values.