【问题标题】:How to call an Odoo model's method with no parameter(except self) on a specific record through xmlrpc in Odoo 13?如何通过 Odoo 13 中的 xmlrpc 在特定记录上调用没有参数(self 除外)的 Odoo 模型的方法?
【发布时间】:2020-11-30 11:08:28
【问题描述】:

我正在开发一个脚本来在 Odoo 模型中创建记录。我需要在特定记录上运行这个模型的方法。在我的情况下,我需要在特定记录上运行的方法没有任何参数(只有self)。我想知道如何通过从客户端到Odoo服务器xmlrpc调用在模型的特定记录上运行该方法。以下是我尝试调用该方法并传递有关this question 的特定记录的ID 的方式。

xmlrpc_object.execute('test_db', user, 'admin', 'test.test', 'action_check_constraint', [record_id])

action_check_constraint 检查模型每条记录上的一些约束,如果所有约束都通过,则更改记录的状态或引发验证错误。但是上面使用xmlrpc 调用的方法会引发以下错误:

xmlrpc.client.Fault: <Fault cannot marshal None unless allow_none is enabled: 'Traceback (most recent call last):\n  File "/home/ibrahim/workspace/odoo13/odoo/odoo/addons/base/controllers/rpc.py", line 60, in xmlrpc_1\n    response = self._xmlrpc(service)\n  File "/home/ibrahim/workspace/odoo13/odoo/odoo/addons/base/controllers/rpc.py", line 50, in _xmlrpc\n    return dumps((result,), methodresponse=1, allow_none=False)\n  File "/usr/local/lib/python3.8/xmlrpc/client.py", line 968, in dumps\n    data = m.dumps(params)\n  File "/usr/local/lib/python3.8/xmlrpc/client.py", line 501, in dumps\n    dump(v, write)\n  File "/usr/local/lib/python3.8/xmlrpc/client.py", line 523, in __dump\n    f(self, value, write)\n  File "/usr/local/lib/python3.8/xmlrpc/client.py", line 527, in dump_nil\n    raise TypeError("cannot marshal None unless allow_none is enabled")\nTypeError: cannot marshal None unless allow_none is enabled\n'>
> /home/ibrahim/workspace/scripts/automate/automate_record_creation.py(328)create_record()

谁能帮助通过xmlrpc客户端到Odoo服务器调用特定记录上的模型方法(除了self之外没有参数)的正确和最佳方式?

【问题讨论】:

    标签: python odoo xml-rpc


    【解决方案1】:

    引发该错误,因为 xmlrpc 库不允许 None 作为默认返回值。但是你应该通过允许它来改变这种行为。

    以下行来自Odoo's external API documentation,扩展为允许None作为返回值:

    models = xmlrpc.client.ServerProxy(
        '{}/xmlrpc/2/object'.format(url), allow_none=True)
    

    有关 xmlrpc ServerProxy 的更多信息,请查看python documentation

    【讨论】:

    • 你是对的,但问题是我添加了allow_none=True,但是当我的方法在这种情况下action_check_constraint 没有明确返回任何内容时仍然有错误。 xmlrpc_objects = client.ServerProxy('http://' + 'localhost:8000/xmlrpc/object',allow_none=True) 。这种情况我该怎么办?
    • 在 python 中不返回任何内容正在返回 None (look into)
    【解决方案2】:

    如果action_check_constraint 没有返回任何内容(默认为None),您可能会收到错误消息。

    尝试在log-level 选项设置为debug_rpc_answer 的情况下运行服务器以获取更多详细信息。

    【讨论】:

    • 您对按方法返回是正确的。现在我添加了allow_none=True,由于一些问题,我无法修改 Odoo 方法以添加显式返回。此外,错误仍然存​​在。
    • Odoo 在base rpc 控制器中明确禁用None 类型。 GitHub 中有一个与 method which returns None over XML-RPC 相关的 Odoo 问题。
    • 我阅读了所有这些答案并明白了你的意思。但我的问题是使用 allow_none=True 并不能解决问题。另外,因为我不允许更改该项目的源代码,所以我无法修改这些方法以返回任何内容而不是 None。那么,我还能做什么呢?
    • 仅在客户端启用该选项将不起作用,您可以在 xmo-odoo 评论中看到:as it's an optional feature it has to be enabled on both client and server, otherwise whichever side doesn't support it will blow up. And of course, there's the issue that if this is allowed on the server it will break clients not expecting it, so it's a bit of a tricky pickle
    【解决方案3】:

    在失去搜索并首先尝试后,我使用this fix 来解决错误,但我认为此修复不是最佳实践。所以,我发现OdooRPC 做同样的工作,但它处理了上述情况,并且对于返回None 的模型方法没有这样的错误。使用 OdooRPC 解决了我的问题,我在 Odoo 中完成了我需要使用 xmlrpc 做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多