问题
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.
回答1:
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:
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.
It is always better use @api.multi with self.ensure_one() instead of @api.one to avoid the side effect in return values.
回答2:
@api.one:
This decorator loops automatically on Records of RecordSet for you. Self is redefined as current record:
@api.one
def func(self):
self.name = 'xyz'
@api.multi:
Self will be the current RecordSet without iteration. It is the default behavior:
@api.multi
def func(self):
len(self)
For the detailed description of all API you can refer this Link
回答3:
@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
来源:https://stackoverflow.com/questions/27988565/when-to-use-api-one-and-api-multi-in-odoo-openerp