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

2019-07-29 09:31发布

我已经创造了A类和其他领域农布雷(整数)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'),

我想创建一个类的函数,根据农布雷字段的值对象b创建记录。 例如,如果NOMBRE = 3我应该创建类B的3对象

这里是我的功能:

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

我得到这些错误:类型错误:范围()整数预期,得到NoneType ValueError异常:词典更新序列元素#0具有长度3; 2,需要

有人可以帮助我提高我的功能?

Answer 1:

你有以下错误:

  1. 您建立来电值应该与字段名作为键,而不是与元组列表的字典。 您正在使用的符号是编写/更新one2many领域。

  2. 你不是在创造“B类”记载,但创建“类”记载,而不是(使用而不是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级你的链接到一个类中列名为“id_classb”? 在OpenERP的礼仪希望你给它们命名“classa_id”或类似的东西。

此外,与首都创建列名是令人难以接受的。



Answer 2:

您可以覆盖“创建”一类的方法和把代码写在此创建方法来创建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 


Answer 3:

您可以创建像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


文章来源: OpenERP : create new record ,one2many many2one relationship