Когда использовать api.один и API.multi в odoo / openerp?
недавно был выпущен odoo (ранее OpenERP) V8. В новом методе API представлены декораторы. в models.py
методы должны быть украшены @api.one
или @api.multi
.
ссыль документация odoo Я не могу определить точное использование. Может кто-нибудь объяснить подробно.
спасибо.
3 ответов
обычно оба декоаратора используются для украшения метода стиля записи, где'self
содержит набор(s). Позвольте мне объяснить вкратце, когда использовать @api.one
и @api.multi
:
1. @api.one
:
украсьте метод стиля записи, где'self ожидается одноэлементный экземпляр.
украшенный метод автоматически зацикливается на записях (i.e, для каждой записи в recordset вызывает метод), и делает список с результатами.
-
если метод украшен @returns, он объединяет результирующие экземпляры. Такой метод:
@API-интерфейс.один метод def (self, args): верните себя.имя
может вызываться как в записи, так и в традиционных стилях, например::
# 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-интерфейс.много метод def (self, args):
может вызываться как в записи, так и в традиционных стилях, например::
# recs = model.browse(cr, uid, ids, context)
recs.method(args)
model.method(cr, uid, ids, args, context=context)
когда использовать:
если вы не используя @API-интерфейс.во-первых, возвращаемое значение находится в списке. Это не всегда поддерживается веб-клиентом, например, при нажатии кнопки методы. В этом случае вы должны использовать @api.multi, чтобы украсить ваш метод,и, вероятно, вызвать себя.ensure_one() в определение метода.
всегда лучше использовать @api.multi с собственной личностью.ensure_one () вместо @api.один, чтобы избежать побочного эффекта в возвращаемых значений.
@API-интерфейс.один:
этот декоратор петли автоматически на записи набора записей для вас. Self переопределяется как текущая запись:
@api.one
def func(self):
self.name = 'xyz'
@API-интерфейс.multi:
Self будет текущим набором записей без итерации. Это поведение по умолчанию:
@api.multi
def func(self):
len(self)
для подробного описания всего API вы можете обратиться к этому ссылке
@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