2012-05-15 98 views
0

我已經在A級和其他領域農佈雷(整數)創建on2many領域:OpenERP的:創造新的紀錄,one2many many2one關係

'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創建記錄。例如,如果農佈雷= 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是必需的

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

回答

2

,可以有以下錯誤:

  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'或類似的東西。

此外,用大寫創建列名稱是不被贊成的。

+0

謝謝Red15您的幫助和你的話,我按照你的答案,但我得到這個錯誤:AttributeError的: 'NoneType'對象沒有屬性'鍵'。我不知道它爲什麼會發生? –

+0

我嘗試了第二個功能,但我也得到一個錯誤! DataError:用於編碼「UTF8」的無效字節序列:0xe96a61 提示:如果字節序列與由「client_encoding」控制的服務器預期的編碼不匹配,也會發生此錯誤。你可以幫我嗎 ? –

+1

謝謝紅,我解決了這個問題,使用第一個函數進入創建方法 –

1

您可以覆蓋A類的「創建」方法&編寫代碼以在此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 
+0

如果我想覆蓋創建方法,我怎樣才能得到當前記錄的「id」。 vals ['id']不起作用!但我可以得到其他字段 –

+0

我更新我的答案 – Avadhesh

+0

感謝您的幫助,現在問題已經修復,因爲您 –

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