Question: 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](https://www.odoo.com/documentation/8.0/) i can not determine the exact use. Can anybody explain in detail.

Thanks.

Answer: 
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.
```
@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

```