2015-01-16 2 views
9

Недавно выпущена версия odoo (ранее OpenERP) V8. В новом API-интерфейсе представлены декораторы. в models.py методах необходимо украсить @api.one или @api.multi.Когда использовать api.one и api.multi в окуне | OpenERP?

Ссылаясь на odoo documentation Я не могу определить точное использование. Может кто-нибудь объяснить подробно.

Спасибо.

ответ

15

Обычно обе декоараторы используются для украшения метода стиля записи, где 'self' содержит recordset (s). Позвольте мне объяснить вкратце, когда использовать @api.one и @api.multi:

1.@api.one:

  • Украсить метод записи стиле, где «само», как ожидается, будет одноэлементно экземпляр.

  • Упорядоченный метод автоматически зацикливается на записях (т. Е. Для каждой записи в наборе записей он вызывает метод), а делает список с результатами.

  • В случае, если метод декорирован с помощью @returns, он объединяет результирующие экземпляры. Такой метод:

    @ api.one метод четкости (я, арг): возвращение self.name

может быть вызвана как записи и традиционных стилей, как ::

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

names = model.method(cr, uid, ids, args, context=context) 
  • Каждый раз, когда «я» переопределяется как текущая запись.

2.@api.multi:

  • Украсить метод записи стиле, где 'self' является набор записей. Метод обычно определяет операцию над записями. Такой метод:

    @ api.multi метод четкости (самообеспечение, арг):

можно назвать как в записи и традиционных стилей, как ::

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

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

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

  1. Если вы используете @ api.one, в RETU Значение rned находится в списке. Это не всегда поддерживается веб-клиентом, например. on button action методов. В этом случае вы должны использовать @api.multi, чтобы украсить ваш метод и, вероятно, вызовите self.ensure_one() в определении метода.

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

+0

Пока я вижу метод декораторы позволяют определить семантическую информацию о том, как вы их обработки записи внутри. Что касается точки «когда использовать api.multi». Являются ли эти критерии основаны на поддержке webclient? Эти проблемы не могут быть решены с помощью api.return во всех случаях? Я так понимаю, мы жертвуем семантической информацией, которая может быть полезна для ORM для оптимизации и принятия правильных вызовов. Я думаю, что это похоже на использование все большего числа операторов SQL, когда ORM не поддерживает какую-либо операцию, а не улучшает ее. – yucer

+0

@BomberMan Спасибо за подробное объяснение! Это решило мою тайну :) Мне было интересно, почему я получил список из своего метода :) – IstaLibera

+0

Хороший ответ! Просто хочу добавить, что @ api.one устарел с v9.0 (https://www.odoo.com/documentation/10.0/reference/orm.html#module-odoo.api) – Fractalf

3

@ api.one:

Этот декоратор автоматически петлями на отчетах RecordSet для вас. Сам переопределено как текущая запись:

@api.one 
def func(self): 
    self.name = 'xyz' 

@ api.multi:

Самостоятельно быть текущим RecordSet без итерации. Это поведение по умолчанию:

@api.multi 
def func(self): 
    len(self) 

Для детального описания всех API вы можете передать этот Link

0
@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 
+0

Пожалуйста, старайтесь избегать просто кода сбрасывания как ответ и попытаться объяснить, что он делает и почему. Ваш код может быть не очевидным для людей, у которых нет соответствующего опыта в кодировании. – Frits

 Смежные вопросы

  • Нет связанных вопросов^_^