OpenERP:创造新纪录,one2many many2one关系

时间:2012-05-15 12:20:26

标签: python xml one-to-many many-to-one openerp

我在A类和其他字段nombre(整数)中创建了on2many字段:

'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中创建一个函数,根据nombre字段的值创建对象b的记录。例如,如果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()期望的整数,得到NoneType ValueError:字典更新序列元素#0的长度为3; 2是必需的

有人可以帮助我改善我的功能吗?

3 个答案:

答案 0 :(得分:2)

您有以下错误:

  1. 您的创建调用值应该是字段名称为键的字典,而不是包含元组的列表。您使用的符号用于编写/更新one2many字段。

  2. 您不是在创建“class b”记录,而是创建“class a”记录(使用self而不是self.pool.get调用)

  3. 所以你应该写

    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-ttiquette希望你将它们命名为“classa_id”或类似的东西。

    另外,用大写字母创建列名是不受欢迎的。

答案 1 :(得分:1)

您可以覆盖Class a& amp;的“创建”方法。编写代码以在此create方法中为类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 

答案 2 :(得分:0)

您可以使用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