Odoo14 rpc
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