odoo14中rpc調用分為兩種。
一種是外部調用rpc來訪問odoo數據,這個時候你需要登錄授權。
另一種是我們自己編寫的widget小部件或者自定義視圖時候通過js通過rpc去獲取數據。
這里說的是第二種rpc的使用。
上代碼:
//調用res.users中的自定義的get_userform_action方法 this._rpc({ model: 'res.users', method: 'get_userform_action', args: [[data.val]]//這里就是python函數聲明里的*args,當你的方法不是model方法也不是model_create方法的時候,這里一個參數傳的是當前model(res.users)的記錄id,它會查詢id結果作為self去調用get_userform_action }).then(function (result){ self.do_action(result); }); //查詢數據的方法 this._rpc({ model: this.model, method: 'read_group', domain: [], fields: ['color'], groupBy: ['color'], }).then(function (result) { _.each(result, function (r) { self.colorGroupData[r.color] = r.color_count; }); });
//自定義的方法 class Users(models.AbstractModel): _inherit = 'res.users' def get_userform_action(self): action = self.env.ref('ship_manage.res_company_user_form_action').read()[0] action['res_id'] = self.id return action
1 //Python rpc參數傳遞源碼 2 def _call_kw_model(method, self, args, kwargs): 3 context, args, kwargs = split_context(method, args, kwargs) 4 recs = self.with_context(context or {}) 5 _logger.debug("call %s.%s(%s)", recs, method.__name__, Params(args, kwargs)) 6 result = method(recs, *args, **kwargs) 7 return downgrade(method, result, recs, args, kwargs) 8 9 10 def _call_kw_model_create(method, self, args, kwargs): 11 # special case for method 'create' 12 context, args, kwargs = split_context(method, args, kwargs) 13 recs = self.with_context(context or {}) 14 _logger.debug("call %s.%s(%s)", recs, method.__name__, Params(args, kwargs)) 15 result = method(recs, *args, **kwargs) 16 return result.id if isinstance(args[0], Mapping) else result.ids 17 18 19 def _call_kw_multi(method, self, args, kwargs): 20 ids, args = args[0], args[1:] 21 context, args, kwargs = split_context(method, args, kwargs) 22 recs = self.with_context(context or {}).browse(ids) 23 _logger.debug("call %s.%s(%s)", recs, method.__name__, Params(args, kwargs)) 24 result = method(recs, *args, **kwargs) 25 return downgrade(method, result, recs, args, kwargs) 26 27 28 def call_kw(model, name, args, kwargs): 29 """ Invoke the given method ``name`` on the recordset ``model``. """ 30 method = getattr(type(model), name) 31 api = getattr(method, '_api', None) 32 if api == 'model'://這里將模型分成了三種走向,三種走向對參數的處理不一樣 33 result = _call_kw_model(method, model, args, kwargs) 34 elif api == 'model_create': 35 result = _call_kw_model_create(method, model, args, kwargs) 36 else: 37 result = _call_kw_multi(method, model, args, kwargs) 38 model.flush() 39 return result