Odoo RPC 示例

下面的示例演示了如何在 Odoo 8 中从 JavaScript 调用 Python 函数。在这些示例中,我们在本页的前面部分描述了 my_model 的方法。
我们假设在以下示例中,“list_of_ids”变量包含“my.model”模型的现有记录的 id 的列表(数组)。

  • 调用方法 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
        });
  • 使用 @ api.model 调用方法 bar_no_deal_with_ids 的调用
    new instance.web.Model("my.model")
        .call( "bar_no_deal_with_ids", [arg1, arg2])
            .then(function (result) {
                // do something with result
        });

此外,如果它有一定的意义取决于实现,那么你可以调用 @ api.multi 修饰的函数,即使你不处理 id(只是传递空数组代替 id,作为参数列表的第一个元素):

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

这种方式在某些情况下可能很有用,因为 v8.0 api 中的未修饰函数被认为是 @ api.multi(因为 @ api.multi 是默认的装饰器)

在上面的例子(函数名和参数列表)中使用的两个参数到 RPC 调用的 Cxcept,你可以使用第三个参数 - 关键字参数字典。强烈建议转换上下文(在某些情况下甚至可能需要),因为它可能会改变远程过程的行为(本地化等)。请参阅下面的 RPC 调用中带有 context 参数的示例(同样可以应用于上面的所有示例)

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
    });

当然,如果需要,你也可以使用自定义上下文,而不是像本示例中那样转换现有上下文。