2016-06-23 12 views
0

Ich habe Fehler: Typeerror: search() dauert mindestens 4 Argumente (2 angegeben)odoo Typeerror: search() dauert mindestens 4 Argumente (2 angegeben)

mit dieser Funktion:

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) 

auf:

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

ich habe versucht, diese Funktion zu neuen api mit self.env aber falsch, etwas zu ändern.

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 

) 

Die Funktion 'def search' wird in der Klasse stock_location (models.Model) verwendet. Also habe ich versucht, diese Funktion von alten API zu neuen API zu ändern. Für die Nachlese der Suche Ich bin mit dieser Funktion:

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

Aber Sie erkennen, die 'liste', die Sie übergeben und die Instanz der Klasse bedeutet, dass Sie nur zwei Argumente übergeben. Was versuchst du zu machen? –

+0

Sie wollen also sagen, dass ich die Funktion Def Suche nicht ändern muss, um neue API mit Self.env? Das Problem ist nicht deswegen? – fueggit

+0

Überprüfen Sie meine Antwort, Sie haben die Parameter cr und uid, die nicht einmal verwendet werden ... entfernen Sie sie und es sollte in Ordnung sein –

Antwort

-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) 

Und für den Aufruf:

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

Prüfen Sie, ob es jetzt funktioniert. Sie erstellen ein echtes Durcheinander mit der Art, wie Sie die Parameter übergeben ...

Sie übergeben nur zwei Parameter und die Methode erwartet mindestens 4. Ein Parameter bezieht sich auf das "Selbst", das mit dem verwandt ist Klassenobjektinstanz. Dann hattest du drei andere Parameter, die du anscheinend nicht einmal benutzt, und dann hast du die Liste der Argumente, die das einzige ist, was du tatsächlich übergibst, wenn du die Methode aufrufst. Mit Kwargs kannst du mehr Flexibilität bieten und erlauben Sie können die Idee besser implementieren, einschließlich der Super (stock_location, self) .Suchteil ...

+0

Danke! Ich verstehe jetzt. Es klappt. Jetzt habe ich einen anderen Fehler: wenn ausdruck [1] in ['like', 'ilike', 'nicht ilike', 'nicht wie', '= wie']. TypeError: Das Objekt 'Cursor' unterstützt keine Indizierung. Ich werde versuchen, weiter zu gehen und das Problem zu suchen, das das verursacht. – fueggit

+0

Entschuldigung, aber nein, das ist nicht die richtige Antwort. Er steht vor einem alten API - neues API-Problem hier. Odoo wechselte seine ORM-Methodenaufrufe zu einer klareren Art, Parameter zu verwenden. So haben sie einige Standardparameter wie cr, uid und context in 'self.env' eingekapselt. Natürlich muss dies durch einen Wrapper gemacht werden, da Odoo beide Möglichkeiten parallel zu altem Code verwendet. Ich werde versuchen, später eine Antwort zu geben. – CZoellner

+0

@CZoellner, für die Frage ist dies die richtige Antwort, die das Problem mit TypeError löst. Wenn die API andere Probleme hat, dann ist es ein anderes Thema. Aber zögern Sie nicht, eine vollständigere Antwort zu geben, die seine Probleme vollständig löst. –