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

0

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

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

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

В классе Б:

'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: диапазон () ожидается целое число, получил NoneType ValueError: элемент последовательности обновления словаря # 0 имеет длину 3; 2 требуется

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

Ваш Ответ

3   ответа
1

Создать & quot; метод класса а написать код для создания записей для класса 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 
Я обновляю свой ответ
если я хочу перезаписать метод Create, как я могу получить & quot; id & quot; текущей записи. vals ['id' '] не работает! но я могу получить другие поля Spirit angel
Спасибо за вашу помощь, проблема исправлена из-за вас Spirit angel
2

Your create call values should be a dictionary with field names as keys, not a list with tuples. The notation you are using is for writing/updating one2many fields.

You are not creating 'class b' records, but creating 'class a' records instead (using self instead of a self.pool.get call)

Так что вы должны написать

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 находится в столбце с именем "a_id_classb"? Этикет openerp ожидает, что вы назовете их «classa_id». или что-то подобное.

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

спасибо Red, я решил проблему, используя первую функцию в метод Create Spirit angel
Спасибо Red15 за вашу помощь и ваше замечание, я следую вашему ответу, но получаю эту ошибку: AttributeError: & apos; NoneType & apos; У объекта нет атрибута «ключи». Я не знаю, почему это происходит? Spirit angel
Я попробовал вторую функцию, но я также получаю ошибку! DataError: недопустимая последовательность байтов для кодировки "UTF8": 0xe96a61 СОВЕТ: Эта ошибка также может возникать, если последовательность байтов не соответствует кодировке, ожидаемой сервером, которая контролируется "client_encoding". вы не могли бы мне помочь ? 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

Похожие вопросы