OpenERP: создать новую запись, one2many many2one отношения

Я создал on2many поле в классе A и другом поле nombre (integer):

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

В классе b:

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

Я хочу создать функцию в классе a, которая создает записи для объекта b в соответствии со значением поля nombre. например, если nombre = 3, я должен создать 3 объекта класса b

вот моя функция:

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

Я получаю эти ошибки: TypeError: range () integer expected, got NoneType ValueError: элемент последовательности обновления словаря # 0 имеет длину 3; 2 требуется

может ли кто-нибудь помочь мне улучшить мою функцию?

    У вас есть следующие ошибки:

    1. Значения ваших созданных вызовов должны быть словарем с именами полей в качестве ключей, а не списком с кортежами. Обозначение, которое вы используете, предназначено для записи / обновления one2many полей.

    2. Вы не создаете записи 'class b', но вместо этого создаете записи 'class a' (используя self вместо вызова self.pool.get)

    Поэтому вы должны написать

     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) 

    Или как альтернатива:

     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) 

    Примечание. В классе b ваша ссылка на класс a находится в столбце с именем 'id_classb'? В openerp-этикетке вы назовете их «classa_id» или что-то подобное.

    Кроме того, недооценивается создание имен столбцов с капиталами.

    Вы можете перезаписать метод «Создать» класса a и написать код для создания записей для класса b в этом методе создания.

    т.е.

     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 

    Вы можете создать одну запись с отношением one2many, например:

     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