サーチ…


備考

新しいメソッドをPythonで追加してJavaScriptからRPCで使用することを検討している場合は、メソッドデコレータの次のオプションを検討してください:ids / recordsetsを処理する必要がある場合は、Pythonメソッド定義でdecoratorを選択してください:

  • @ api.multi - メソッド内でレコードセットを取得する
  • @ api.one - あなたのメソッドで上記の例でbrowse_recordsを 1つずつ取得する@ api.multiが使用されていますが、要件に応じてidを処理するために@ api.oneを使用することもできます(ただし、パフォーマンス上の理由から@ api.oneではなくapi.multi)。

または、レコード/ IDを処理する必要のない単純な関数なら、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)

Odoo RPCの例

以下の例は、Odoo 8のJavaScriptからPython関数を呼び出す方法を示しています。この例では、このページの早い段階で説明したmy_modelのメソッドを呼び出します。
次の例では、 "list_of_ids"変数に "my.model"モデルの既存レコードのIDのリスト(配列)が含まれていると仮定します。

  • @ api.multiで装飾されたメソッドfoo_manipulate_records_1の呼び出し:
    new instance.web.Model("my.model")
        .call( "foo_manipulate_records_1", [list_of_ids])
            .then(function (result) {
                // do something with result
        });

  • @ api.multiで装飾されたメソッドfoo_manipulate_records_2の呼び出し:
    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
        });

実装に応じていくつかの意味がある場合でも、idを扱わなくても@api.multiで装飾された関数を呼び出すことができます(引数リストの最初の要素として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呼び出しに対する2つのパラメータ(関数名と引数リスト)のCxceptでは、 キーワード引数の辞書である 3番目のパラメータを使用できます 。リモートプロシージャ(ローカリゼーションなど)の動作が変更される可能性があるため、コンテキストを回すことを強くお勧めします(必要な場合もあります)。 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