【问题标题】:odoo TypeError: search() takes at least 4 arguments (2 given)odoo TypeError: search() 至少需要 4 个参数(给定 2 个)
【发布时间】:2016-06-27 14:52:35
【问题描述】:

我收到错误:TypeError: search() 至少需要 4 个参数(给定 2 个)

使用此功能:

def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False):
    order='complete_name'
    for index, expr in enumerate(args):
        if expr[1] in ['like', 'ilike', 'not ilike', 'not like', '=like']:
            args[index][2] = re.sub(r"\s+", '%', expr[2])
    return super(stock_location, self).search(cr, uid, args, offset, limit, order, context, count)

开:

pickings = self.env['stock.picking'].search([('picking_type_id.id','=',picking_type_id),('state','=','assigned')])

我尝试使用 self.env 将此函数更改为新的 api,但出现了问题。

    def search(self, args, offset=0, limit=None, order=None, context=None, count=False):
        order='complete_name'
        for index, expr in enumerate(args):
            if expr[1] in ['like', 'ilike', 'not ilike', 'not like', '=like']:
                args[index][2] = re.sub(r"\s+", '%', expr[2])
        return super(stock_location, self).search(self.env, args, offset, limit, order, context, count

)

函数 'def search' 在类 stock_location(models.Model) 中使用。所以我尝试将这个功能从旧的api更改为新的api。为了搜索我正在使用这个功能的选择:

def _compute_can_validate(self):
        user_is_admin = self.env.user._is_admin()
        user_is_network_manager = self.user_has_groups('stock.group_stock_network_manager')
        owned_locations = []
        if user_is_network_manager:
        owned_locations = self.env['stock.location'].search([('user_ids','in',self.env.user.id),
                                                             ('type_id.code','=','network')])

【问题讨论】:

  • 但是您意识到您正在传递list,并且该类的实例意味着您只传递了两个参数。你想做什么?
  • 所以你想说我不需要用self.env把函数def search改成新的api?问题是不是因为这个?
  • 检查我的答案,你有参数 cr 和 uid 甚至没有被使用...删除它们应该没问题
  • 您能提供您尝试搜索精选的方法/功能吗?我需要函数/方法定义来回答你的问题
  • 我用我用来搜索精选的功能编辑了我的问题。

标签: python-2.7 openerp odoo-9


【解决方案1】:
def search(self, *args, **kwargs):
    # -> cr, uid??? what are these parameters for? You are not using them at all... 
    offset = kwargs.get("offset", 0)
    limit = kwargs.get("limit", None)
    order = kwargs.get("order", 'complete_name')
    context = kwargs.get("context", None)
    count = kwargs.get("count", False)
    for index, expr in enumerate(args):
        if expr[1] in ['like', 'ilike', 'not ilike', 'not like', '=like']:
            args[index][2] = re.sub(r"\s+", '%', expr[2])
    return super(stock_location, self).search(*args, **kwargs)

对于调用:

pickings = self.env['stock.picking'].search(('picking_type_id.id','=',picking_type_id),('state','=','assigned'))

看看它现在是否有效。您正在使用传递参数的方式造成真正的混乱......

您只传递了两个参数,并且该方法至少需要 4 个。一个参数与“self”相关,该“self”与类对象实例相关。然后你有其他三个参数,看起来你甚至没有使用,然后你有参数列表,这是你调用方法时唯一实际传递的东西....使用 kwargs 可以为您提供更大的灵活性并允许你更好地实现这个想法,包括 super(stock_location, self).search 部分......

【讨论】:

  • 谢谢!我现在知道了。有用。现在我有另一个错误: if expr[1] in ['like', 'ilike', 'not ilike', 'not like', '=like']. TypeError:'Cursor' 对象不支持索引。我会尝试进一步搜索导致此问题的问题。
  • 抱歉,这不是正确的答案。他在这里面临一个旧的 API - 新的 API 问题。 Odoo 将他的 ORM 方法调用转换为更清晰的参数使用方式。所以他们将一些默认参数如cr、uid和context封装到self.env。当然,这必须由包装器完成,因为 Odoo 使用两种并行方式来兼容旧代码。我稍后会尝试给出答案。
  • @CZoellner,对于这个问题,这是正确的答案,它正在解决与 TypeError 相关的问题。如果 API 有其他问题,那就是另一个话题了。但是请随时提供更完整的答案,以完全解决他的问题。
  • @RicardoSilveira 我真的很想知道,但我需要知道他的搜索电话在哪里完成。我敢打赌,包装器正在包装旧 API 之类的调用,所以他只需要在他的调用中添加 cr、uid 和上下文。
  • 但是如果他用**kwargs解压缩kwargs,他就不用担心了。
猜你喜欢
  • 1970-01-01
  • 2017-06-04
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多