2016-06-23 74 views
0

我得到錯誤:類型錯誤:搜索()至少需要4個參數(2給出)odoo類型錯誤:搜索()至少需要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')]) 

我試圖改變這一功能新的API與self.env但蹊蹺的。

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')]) 
+0

但是你意識到你傳遞的'list',並且這個類的實例意味着你只傳遞了兩個參數。你想做什麼? –

+0

所以你想說,我不需要改變函數def搜索到self.env的新API?問題不是因爲這個? – fueggit

+0

檢查我的答案,你有參數cr和uid甚至沒有被使用...刪除它們,它應該沒事 –

回答

-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.一個參數與'自我',這是有關的類對象實例。然後你有三個其他的參數,看起來你甚至沒有使用,然後你有參數列表,這是你調用方法時實際傳遞的唯一參數列表....使用kwargs可以爲你提供更多的靈活性並允許你更好地實現這個想法,包括super(stock_location,self).search部分...

+0

謝謝!我現在知道了。有用。現在我還有一個錯誤:如果['like','ilike','not ilike','not like','= like']中的expr [1]。 TypeError:'遊標'對象不支持索引。我會嘗試進一步搜索導致此問題的問題。 – fueggit

+0

對不起,但不是,這不是正確的答案。他正面臨着一箇舊的API--新的API問題。 Odoo將他的ORM方法調用切換爲更清晰的參數使用方式。所以他們將一些默認參數封裝成'self.env',比如cr,uid和context。當然,這必須通過一個包裝來完成,因爲Odoo使用兩種方式來兼容舊代碼。我會盡力在稍後回答。 – CZoellner

+0

@CZoellner,對於這個問題,這是正確的答案,它正在解決與TypeError有關的問題。如果API有其他問題,那麼這是另一個話題。但隨時提供一個更完整的答案,完全解決他的問題。 –

相關問題