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

當然,如果需要,你也可以使用自定義上下文,而不是像本示例中那樣轉換現有上下文。