OpenERP: создать новую запись, отношения one2many many2one
Я создал поле 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 ответа
У вас есть следующие ошибки:
Создаваемые значения вызовов должны быть словарем с именами полей в качестве ключей, а не списком с кортежами. Обозначение, которое вы используете для написания / обновления полей one2many.
Вы не создаете записи "класса b", а вместо этого создаете записи "класса 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" или что-то подобное.
Кроме того, создание имен столбцов с заглавными буквами не одобряется.
Вы можете переписать метод "Create" класса a и написать код для создания записей для класса b в этом методе create.
т.е.
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