Когда использовать 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)

когда использовать:

  1. если вы не используя @API-интерфейс.во-первых, возвращаемое значение находится в списке. Это не всегда поддерживается веб-клиентом, например, при нажатии кнопки методы. В этом случае вы должны использовать @api.multi, чтобы украсить ваш метод,и, вероятно, вызвать себя.ensure_one() в определение метода.

  2. всегда лучше использовать @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