ODOO 如何使用 XMLRPC 库从 Android Studio 创建 many2one 记录?

ODOO How to create many2one record from Android Studio using aXMLRPC library?

我正在尝试在 fleet.vehicle 模型中创建新记录。由于记录的 TypeMany2One,它抛出以下异常。

de.timroes.axmlrpc.XMLRPCServerException: Traceback (most recent call last):

但是我能够使用相同的代码片段在 res.user 模型中创建一条记录,因为 Type 是 char对于 res.user 型号。
我的代码片段是:

public Integer create(String model, HashMap values) {
        Integer newObjectId = null;
        try {

            XMLRPCClient client = new XMLRPCClient(mUrl);

            Object[] parameters = {mDatabase, mUserId, mPassword, model, "create" ,new Object[]{values}};
            newObjectId = (Integer) client.call("execute_kw", parameters);

        } catch (XMLRPCException e) {
            Log.d(CONNECTOR_NAME, e.toString());
        }
        return newObjectId;
    }  

日志是:

de.timroes.axmlrpc.XMLRPCServerException: Traceback (most recent call last):
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/wsgi_server.py", line 124, in wsgi_xmlrpc
    result = odoo.http.dispatch_rpc(service, method, params)
  File "/home/wms/RMS/9040/new_odoo11/odoo/http.py", line 115, in dispatch_rpc
    result = dispatch(method, params)
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/model.py", line 39, in dispatch
    res = fn(db, uid, *params)
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/model.py", line 153, in execute_kw
    return execute(db, uid, obj, method, *args, **kw or {})
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/model.py", line 97, in wrapper
    return f(dbname, *args, **kwargs)
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/model.py", line 160, in execute
    res = execute_cr(cr, uid, obj, method, *args, **kw)
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/model.py", line 149, in execute_cr
    return odoo.api.call_kw(recs, method, args, kw)
  File "/home/wms/RMS/9040/new_odoo11/odoo/api.py", line 687, in call_kw
    return call_kw_model(method, model, args, kwargs)
  File "/home/wms/RMS/9040/new_odoo11/odoo/api.py", line 672, in call_kw_model
    result = method(recs, *args, **kwargs)
  File "/home/wms/RMS/9040/new_odoo11/addons/fleet/models/fleet_vehicle.py", line 197, in create
    vehicle = super(FleetVehicle, self.with_context(mail_create_nolog=True)).create(data)
  File "/home/wms/RMS/9040/ac-ars/ac_rms/models/planner_calender.py", line 422, in create
    res_id = super(MailThread, self).create(values)
  File "/home/wms/RMS/9040/new_odoo11/addons/mail/models/mail_thread.py", line 231, in create
    thread = super(MailThread, self).create(values)
  File "/home/wms/RMS/9040/new_odoo11/odoo/models.py", line 3278, in create
    record = self.browse(self._create(old_vals))
  File "/home/wms/RMS/9040/new_odoo11/odoo/models.py", line 3371, in _create
    cr.execute(query, tuple(u[2] for u in updates if len(u) > 2))
  File "/home/wms/RMS/9040/new_odoo11/odoo/sql_db.py", line 155, in wrapper
    return f(self, *args, **kwargs)
  File "/home/wms/RMS/9040/new_odoo11/odoo/sql_db.py", line 232, in execute
    res = self._obj.execute(query, params)
psycopg2.DataError: invalid input syntax for integer: "Audi A3"
LINE 1: ...et_vehicle_id_seq'), 5, true, 'kilometers', NULL, 'Audi A3',...
 [1]

我附上了一张我正在尝试创建的图片。任何帮助深表感谢。 我的问题是如何在 odoo 中从 Android/Java 创建类型为 Many2One 的新记录?

根据回溯 sycopg2.DataError: invalid input syntax for integer: "Audi A3" 是说您传递了一个非整数值。只需将 Audi A3 替换为 id。然后重试。

希望对您有所帮助。

我正在回答我自己的问题。这个问题的答案非常简单,我发现探索、调试和尝试使用 XMLRPC 库。我就是这样解决的。
我试图更新的字段只接​​受已在 odoo 中预设的数据。例如:我必须首先使用 search_read 功能搜索该字段的可用预设数据。喜欢..

OdooConnect oc = OdooConnect.connect(SERVER_URL, PORT_NO, DB_NAME, USER_ID, PASSWORD);
List<HashMap<String, Object>> data = oc.search_read("fleet.vehicle", new Object[]{
                new Object[]{condition}}, "id");

我在这里做的是搜索与我要创建的字段相关的所有预设数据,并获取与我要在特定条件下更新的字段匹配的字符串的 id。 这里的条件是

new Object[]{new Object[]{new Object[]{"name", "=", "Audi A3"}}}

所以当它与该条件匹配时,它 returns 我需要传递给 many2one 字段的对象的 id。 在上面的代码中,"id" 用于请求符合条件的字符串的 id。 现在我们将在创建新记录时将 id 传递给 many2one 字段。将 id 传递给下面的创建方法。

final Integer idC = oc.create("web.service", new HashMap() {{
                put("name", "Final Test");
                put("value", 29); //
                put("partner_id", id); //many2One field. here we are using pre defined value i,e setting a value of other relation model to partner_id
        }});

希望对正在寻找答案的人有所帮助。 :)