Поиск…


замечания

Если вы планируете добавлять новые методы в Python для использования их в RPC из JavaScript, тогда рассмотрите следующие варианты декораторов методов: если вам нужно иметь дело с идентификаторами / наборами записей, то для определения метода python выберите decorator:

  • @ api.multi - получить набор записей в вашем методе
  • @ api.one - для получения browse_records один за другим в вашем методе в приведенных выше примерах используется @ api.multi, но @ api.one также может использоваться для обработки идентификаторов в зависимости от требований (однако настоятельно рекомендуется использовать @ api.multi вместо @ api.one по соображениям производительности).

Или, если это простая функция, которая не должна иметь дело с записями / идентификаторами, то для метода python выберите декоратор:

  • @ api.model - Позволяет быть вежливым с API старого стиля.
  • @ api.multi - Опять же, вы можете использовать его здесь также, просто передайте [ ] (пустой массив) в качестве первого аргумента в javascript ...

Ссылки: Документация Odoo RPC , Декораторы методов Odoo 8 API

Пример модели Odoo для вызова методов из

class my_model(models.Model):
    _name = "my.model"

    name = fields.Char('Name')

    @api.multi
    def foo_manipulate_records_1(self):
        """ function returns list of tuples (id,name) """
        return [(i.id,i.name) for i in self]

    @api.multi
    def foo_manipulate_records_2(self, arg1, arg2)
        #here you can take advantage of "self" recordset and same time use aditional arguments "arg1", "arg2"
        pass

    @api.model
    def bar_no_deal_with_ids(self, arg1, arg2):
        """ concatenate arg1 and arg2 """
        return unicode(arg1) + unicode(arg2)

Примеры RPC Odoo

Примеры ниже демонстрируют, как вызвать функцию Python из JavaScript в Odoo 8. В примерах мы называем методы my_model, описанные ранее на этой странице.
Предположим, что в следующих примерах переменная «list_of_ids» содержит список (массив) идентификаторов существующих записей модели «my.model».

  • Вызов метода foo_manipulate_records_1, украшенный с помощью @ api.multi :
    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_1", [list_of_ids])
            .then(function (result) {
                // do something with result
        });

  • Вызов метода foo_manipulate_records_2, украшенный @ api.multi :
    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_2", [list_of_ids, arg1, arg2])
            .then(function (result) {
                // do something with result
        });

  • Вызов метода bar_no_deal_with_ids, украшенный с помощью @ api.model :
    new instance.web.Model("my.model")
        .call( "bar_no_deal_with_ids", [arg1, arg2])
            .then(function (result) {
                // do something with result
        });

Также, если это имеет смысл в зависимости от реализации, вы можете вызвать функцию, украшенную @ api.multi, даже если вам не нужно иметь дело с идентификаторами (просто передайте пустой массив вместо ids, как первый элемент списка аргументов):

    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_2", [[], arg1, arg2])
            .then(function (result) {
                // do something with result
        });

этот способ может быть полезен в некоторых случаях, поскольку unecorated function в v8.0 api рассматривается как @ api.multi (поскольку @ api.multi является декоратором по умолчанию)

При использовании двух параметров для вызова RPC, которые используются в приведенных выше примерах (имя функции и список аргументов), вы можете использовать третий параметр - словарь аргументов ключевого слова . Настоятельно рекомендуется обходить контекст (в некоторых случаях это может быть даже необходимо), так как это может изменить поведение удаленной процедуры (локализация и т. Д.). Ниже приведен пример с аргументом контекста в вызове RPC (то же самое можно применить ко всем приведенным выше примерам)

var self = this;
new instance.web.Model("my.model")
    .call("foo_manipulate_records_2", [[], arg1, arg2], {'context':self.session.user_context})
        .then(function (result) {
            // do something with result
    });

Разумеется, вы также можете использовать пользовательский контекст, если это необходимо, вместо того, чтобы оборачивать существующий, как в этом примере.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow