OpenERP: Erstellen Sie neue Rekord, one2many many2one Beziehung

Ich habe on2many Feld in Klasse A und anderen Feld nombre (Integer) 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 der Klasse a erstellen, die Datensätze für Objekt b entsprechend dem Wert des Nombre-Feldes erzeugt. Zum Beispiel wenn nombre = 3 Ich sollte 3 Objekt 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 bekomme diese Fehler: TypeError: range () integer erwartet, bekam NoneType ValueError: Wörterbuch Update Sequenz Element # 0 hat Länge 3; 2 erforderlich ist

Kann mir jemand helfen, meine Funktion zu verbessern?

3 Solutions collect form web for “OpenERP: Erstellen Sie neue Rekord, one2many many2one Beziehung”

Sie haben folgende Fehler:

  1. Ihre Rufnummern sollten ein Wörterbuch mit Feldnamen als Schlüssel sein, nicht eine Liste mit Tupeln. Die Notation, die Sie verwenden, ist für das Schreiben / Aktualisieren von one2many-Feldern.

  2. Sie sind nicht die Schaffung 'Klasse B' Datensätze, sondern die Schaffung von 'Klasse a' Datensätze statt (mit Selbst statt einer self.pool.get Anruf)

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 als Alternative:

 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 der Klasse b ist dein Link zur Klasse a in der Spalte "id_classb"? Die openerp-Etikette erwartet, dass du sie 'classa_id' oder so ähnlich nennst.

Auch die Erstellung von Spaltennamen mit Großbuchstaben ist verpönt.

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

Dh

 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 

Sie können einen Datensatz mit one2many Beziehung wie:

 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 
  • Wie man Kommentare beim Analysieren von XML mit Python / ElementTree behält
  • Pythons xml.etree getiterator entspricht C #
  • BeautifulSoup get_text nicht alle Tags und JavaScript
  • Code, der aus xml mit Python erstellt wurde
  • Ersetzen des XML-Elements in Python
  • Streifen Sie alle Namespace Deklarationen, Tags und Attribute aus SVG-Datei mit Python / lxml
  • Füge origonale xml-Datei von für Schleife in python hinzu
  • Python und ElementTree: return "inneres XML" ohne übergeordnetes Element
  • Parse XML-Datei in Python-Objekt
  • Kann keine Deklaration des Elements 'xml' finden
  • Auswählen von Element nach ID, in .svg xml
  • Python ist die beste Programmiersprache der Welt.