Frage an python, many-to-one, one-to-many, openerp, xml – OpenERP: Erstellen Sie einen neuen Datensatz, eine oder mehrere Beziehungen

0

Ich habe on2many-Felder in Klasse A und andere Feldnummern (Ganzzahlen) erstellt:

'Inventaire' : fields.one2many('class.b','id_classb'),

'nombre' : fields.integer('Nombre'),

In Klasse B:

'id_classb' : fields.many2one('class.a', 'ID_classA'),

'ql' : fields.integer('QL'),

Ich möchte eine Funktion in Klasse a erstellen, die Datensätze für Objekt b gemäß dem Wert des Felds "nombre" erstellt. Wenn zum Beispiel nombre = 3 ist, sollte ich 3 Objekte der Klasse b erstellen

hier ist meine funktion:

 def save_b(self, cr, uid, ids, field_name, arg, context):
  a= self.browse(cr, uid, id)
  nbr=a.nombre
  num=22
  for i in range(nbr):
       num+=1
       self.create(cr, uid, [(0, 0,{'ql':num})])

Ich erhalte die folgenden Fehlermeldungen: TypeError: range () Ganzzahl erwartet, NoneType ValueError: Sequenzelement Nr. 0 für Wörterbuchaktualisierung hat die Länge 3; 2 ist erforderlich

Kann mir jemand helfen, meine Funktion zu verbessern?

Deine Antwort

3   die antwort
0

Sie können einen Datensatz mit einer beliebigen Beziehung wie folgt erstellen:

invoice_line_1 = {
   'name': 'line description 1',
   'price_unit': 100,
   'quantity': 1,
}

invoice_line_2 = {
   'name': 'line description 2',
   'price_unit': 200,
   'quantity': 1,
}

invoice = {
   'type': 'out_invoice',
   'comment': 'Invoice for example',
   'state': 'draft',
   'partner_id': 1,
   'account_id': 19,
   'invoice_line': [
       (0, 0, invoice_line_1),
       (0, 0, invoice_line_2)
   ]
}

invoice_id = self.pool.get('account.invoice').create(
        cr, uid, invoice, context=context)

return invoice_id
2

Sie haben folgende Fehler:

Ihre Erstellungsaufrufwerte sollten ein Wörterbuch mit Feldnamen als Schlüssel sein, keine Liste mit Tupeln. Die Notation, die Sie verwenden, dient zum Schreiben / Aktualisieren von zwei Feldern.

Sie erstellen keine 'Klasse-B'-Datensätze, sondern' Klasse-A'-Datensätze (verwenden self anstelle eines Aufrufs von self.pool.get).

Also solltest du schreiben

def save_b(self, cr, uid, ids, field_name, arg, context):
    b_obj = self.pool.get('class.b') # Fixes (#2)
    for record in self.browse(cr, uid, ids, context=context):
        num = 22
        for i in range(record.nombre):
            num += 1
            new_id = b_obj.create(cr, uid, {
                'ql': num,
                'id_classb': record.id
            }, context=context) # Fixes (#1)

Oder alternativ:

def save_b(self, cr, uid, ids, field_name, arg, context):
    for record in self.browse(cr, uid, ids, context=context):
        sub_lines = []
        num = 22
        for i in range(record.nombre):
            num += 1
            sub_lines.append( (0,0,{'q1': num}) )
            # Notice how we don't pass id_classb value here,
            # it is implicit when we write one2many field
        record.write({'Inventaire': sub_lines}, context=context)

Anmerkung: In Klasse b befindet sich Ihr Link zu Klasse a in der Spalte 'id_classb'? Die Openerp-Etikette erwartet, dass Sie sie "classa_id" oder etwas Ähnliches nennen.

Das Erstellen von Spaltennamen mit Großbuchstaben ist ebenfalls verpönt.

Vielen Dank, Red15, für Ihre Hilfe und Ihre Bemerkung. Ich folge Ihrer Antwort, erhalte jedoch den folgenden Fehler: AttributeError: Das Objekt 'NoneType' hat kein Attribut 'keys'. Ich weiß nicht, warum es auftritt? Spirit angel
danke Red, ich löse das Problem mit der ersten Funktion in Create-Methode Spirit angel
Ich habe die zweite Funktion ausprobiert, bekomme aber auch eine Fehlermeldung !! DataError: ungültige Bytesequenz für Codierung "UTF8": 0xe96a61 TIPP: Dieser Fehler kann auch auftreten, wenn die Bytesequenz nicht mit der vom Server erwarteten Codierung übereinstimmt, die von "client_encoding" gesteuert wird. kannst du mir helfen ? Spirit angel
1

Sie können die "Create" -Methode von Klasse a überschreiben und den Code schreiben, um Datensätze für Klasse b in dieser Erstellungsmethode zu erstellen.

d.h.

def create(self, cr, uid, values, context=None):
    new_id = super(class_a, self).create(cr, uid, values, context)
    class_b_obj = self.pool.get('class.b')
    for i in values['nobr']:
        #  vals_b = {}
        # here create value list for class B 
         vals_b['ql'] = i
         vals_b['id_class_b'] = new_id 

        class_b_obj.create(cr,uid, vals_b , context=context)
    return new_id 
Wenn ich die Create-Methode überschreiben möchte, wie kann ich die "ID" des aktuellen Datensatzes ermitteln? vals ['id'] funktioniert nicht! aber ich kann andere Felder bekommen Spirit angel
Vielen Dank für Ihre Hilfe, das Problem ist jetzt wegen Ihnen behoben Spirit angel
Ich aktualisiere meine Antwort Avadhesh

Verwandte Fragen