首页 > 解决方案 > Odoo14,外部 API:自定义模型在通过 python 访问时有效,但在通过 PHP 访问时无效

问题描述

这是我一直在努力解决的一个非常奇怪的问题。

我创建了一个自定义模型,我需要通过外部 API 访问它。

模型:(我相信功能本身并不重要,还不如只是return "hi"

class StockApi(models.Model):
    _name = "stock.api"

    @api.model
    def get_lot_info(self, vals):
        """
        Returns the best before date of the current batch of a product specified by its SKU
        """
        val = vals[0]
        if val[0].lower() != "sku":
            return "sku is needed"

        product = self.env['product.product'].search([['default_code','=',val[2]]])
        if len(product) == 0:
            return "product not found"
        product = product[0]

        lot = self.env['stock.quant'].search(['&',('product_id', '=', product['id']),('on_hand', '=', True)], order='removal_date asc')
        if len(lot) == 0:
            return False
        
        return lot[0]['removal_date']

这在通过 python api 访问时有效,我收到删除日期

common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
uid = common.authenticate(db, username, password, {})
models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))

def odoo(*args):
    return models.execute_kw(db, uid, password, *args)
odoo(
    'stock.api',
    'get_lot_info',
    [[[
        'sku', '=', '1012', 
    ]]]
    )

但是,当通过 PHP 使用 ripcord 库访问时,它不起作用:

$common = ripcord::client($this->url.'/xmlrpc/2/common');
$this->uid = $common->authenticate($this->db, $this->username, $this->password, array());
$this->models = ripcord::client($this->url . "/xmlrpc/2/object");   
echo var_export( $this->models->execute_kw(
    $this->db, $this->uid, $this->password, 
    'stock.api', 'get_lot_info', array(array(array('sku', '=', '1012')))  
    ), true);

我只是得到这个错误:array( 'faultCode' => 2, 'faultString' => 'Object stock.api doesn\'t exist',)

访问变量(用户名、数据库等)始终相同。PHP API 确实适用于其他模型。我可以成功地拉sale.orderres.partner等等,这让我很难理解。

编辑:出于兴趣,我将新模型放在生产服务器上,在那里我也可以使用 PHP 访问它。这有点烦人,因为如果我可以在登台服务器上工作,那就太好了……登台服务器是我的本地 PC。也许问题与这个事实有关。

标签: pythonphpodooxml-rpcripcord

解决方案


推荐阅读