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
});
当然,如果需要,你也可以使用自定义上下文,而不是像本示例中那样转换现有上下文。