Обычно обе декоараторы используются для украшения метода стиля записи, где '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)
Когда использовать:
Если вы используете @ api.one, в RETU Значение rned находится в списке. Это не всегда поддерживается веб-клиентом, например. on button action методов. В этом случае вы должны использовать @api.multi, чтобы украсить ваш метод и, вероятно, вызовите self.ensure_one() в определении метода.
Всегда лучше использовать @ api.multi с self.ensure_one() вместо @ api.one, чтобы избежать побочного эффекта в возвращаемых значениях.
Пока я вижу метод декораторы позволяют определить семантическую информацию о том, как вы их обработки записи внутри. Что касается точки «когда использовать api.multi». Являются ли эти критерии основаны на поддержке webclient? Эти проблемы не могут быть решены с помощью api.return во всех случаях? Я так понимаю, мы жертвуем семантической информацией, которая может быть полезна для ORM для оптимизации и принятия правильных вызовов. Я думаю, что это похоже на использование все большего числа операторов SQL, когда ORM не поддерживает какую-либо операцию, а не улучшает ее. – yucer
@BomberMan Спасибо за подробное объяснение! Это решило мою тайну :) Мне было интересно, почему я получил список из своего метода :) – IstaLibera
Хороший ответ! Просто хочу добавить, что @ api.one устарел с v9.0 (https://www.odoo.com/documentation/10.0/reference/orm.html#module-odoo.api) – Fractalf