Pytanie w sprawie python, xml, many-to-one, one-to-many, openerp – OpenERP: utwórz nowy rekord, relacja one2many many2one

0

Utworzyłem pole on2many w klasie A i inne pole nombre (integer):

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

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

W klasie b:

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

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

Chcę utworzyć funkcję w klasie a, która tworzy rekordy dla obiektu b zgodnie z wartością pola nombre. na przykład jeśli nombre = 3 powinienem utworzyć 3 obiekt klasy b

oto moja funkcja:

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

Dostaję te błędy: TypeError: range () oczekiwana liczba całkowita, get NoneType ValueError: element sekwencji aktualizacji słownika # 0 ma długość 3; 2 jest wymagane

czy ktoś może mi pomóc poprawić moją funkcję?

Twoja odpowiedź

3   odpowiedź
1

aby utworzyć rekordy dla klasy b w tej metodzie tworzenia.

to znaczy

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 
Aktualizuję swoją odpowiedź Avadhesh
Dziękujemy za pomoc, problem został rozwiązany dzięki Tobie Spirit angel
jeśli chcę nadpisać metodę Create, jak mogę uzyskać „id” bieżącego rekordu. vals ['id'] nie działa! ale mogę dostać inne pola Spirit angel
2

Tworzone wartości wywołania powinny być słownikiem z nazwami pól jako kluczami, a nie listą z krotkami. Notacja, której używasz, służy do pisania / aktualizowania pól one2many.

Nie tworzysz rekordów „klasy b”, ale zamiast tego tworzysz rekordy „klasy a” (używając self zamiast połączenia self.pool.get)

Więc powinieneś pisać

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)

Lub jako alternatywa:

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)

Uwaga: W klasie b link do klasy a znajduje się w kolumnie o nazwie „id_classb”? Etykieta openerp oczekuje, że nazwiesz ją „classa_id” lub czymś podobnym.

Również tworzenie nazw kolumn z dużymi literami nie jest mile widziane.

Dziękujemy Red15 za pomoc i uwagę, podążam za odpowiedzią, ale otrzymuję ten błąd: AttributeError: Obiekt „NoneType” nie ma atrybutów „kluczy”. Nie wiem, dlaczego to się dzieje? Spirit angel
Spróbowałem drugiej funkcji, ale dostałem także błąd !! DataError: niepoprawna sekwencja bajtów do kodowania „UTF8”: 0xe96a61 WSKAZÓWKA: Ten błąd może się również zdarzyć, jeśli sekwencja bajtów nie odpowiada kodowaniu oczekiwanemu przez serwer, który jest kontrolowany przez „kodowanie_klienta”. możesz mi pomóc ? Spirit angel
dziękuję Red, rozwiązałem problem, używając pierwszej funkcji do metody Create Spirit angel
0

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

Powiązane pytania