2017-06-22 15 views
2

這是我的函數:AttributeError:'bool'對象沒有屬性?

@api.multi 
 
    def write(self, vals): 
 
     if vals['Amount'] > 0: 
 
      vals['Amount_date'] = fields.Datetime.now() 
 
      record=super(MedicalLab, self).write(vals)   
 
      self.env['medical.journal'].create({ 
 
       'patient_id': record.patient_id, 
 
       'cat': record.cat, 
 
       'test_type_id': record.test_type_id, 
 
       'state_money':record.state_money, 
 
       'Amount_in_date':record.Amount_date, 
 
       'type_In': "Reste", 
 
       'Amount_In':record.Amount, 
 
       'user_id': record.user_id, 
 
       'type_lev1': "IN",         
 
      }) 
 
     return record

這是錯誤:

AttributeError: 'bool' object has no attribute 'patient_id'

EDITS:

@api.multi 
 
    def write(self, vals): 
 
     if vals['Amount'] > 0: 
 
      vals['Amount_date'] = fields.Datetime.now() 
 
     
 
      self.env['medical.journal'].create({ 
 
       'patient_id': vals['patient_id'], 
 
       'cat': vals['cat'], 
 
       'test_type_id': vals['test_type_id'], 
 
       'state_money':vals['state_money'], 
 
       'Amount_in_date':vals['Amount_date'], 
 
       'type_In': "Reste", 
 
       'Amount_In':vals['Amount'], 
 
       'user_id': vals['user_id'], 
 
       'type_lev1': "IN",         
 
      }) 
 
    
 
     return super(MedicalLab, self).write(vals)

新的錯誤是:

'patient_id': vals['patient_id'],

KeyError: 'patient_id'

+1

好'記錄'原來是一個布爾值...你確定'超(MedicalLab,self).write(vals)'返回一個對象/字典嗎?而不僅僅是一個指示成功的布爾值? –

+0

這指向'super(MedicalLab,self).write'方法。你似乎期待它返回比布爾值更多的東西。你有權訪問它的實現或文檔嗎? –

+0

我需要爲'medical.journal'創建一條記錄,一旦我修改'MedicalLab' – Borealis

回答

4

如果不修改該字段patient_id它不會在丘壑字典傳遞。如果未在UI中分配patient_id,則會正確指定值False。如果您打印vals字典並查看您的日誌或標準輸出,您應該發現patient_id可能爲False,表明它尚未分配。在訪問它的屬性之前,我可能會做一些評估。

'patient_id': vals['patient_id'] if vals.get('patient_id') else False, 
1
@api.multi 
def write(self, vals): 
    if vals['Amount'] > 0: 
     vals['Amount_date'] = fields.Datetime.now() 
     record=super(MedicalLab, self).write(vals)   
     self.env['medical.journal'].create({ 
      'patient_id': record.patient_id.id, 
      'cat': record.cat, 
      'test_type_id': record.test_type_id.id, 
      'state_money':record.state_money, 
      'Amount_in_date':record.Amount_date, 
      'type_In': "Reste", 
      'Amount_In':record.Amount, 
      'user_id': record.user_id.id, 
      'type_lev1': "IN",         
     }) 
    return record 

法「寫」不返回任何東西,你可以參考https://www.odoo.com/documentation/10.0/reference/orm.html#odoo.models.Model.write,所以如果你想獲得最新的數據寫入後,最好重新瀏覽數據,然後創建medicallab,所以我「M提示:

@api.multi 
def write(self, vals): 
    if vals['Amount'] > 0: 
     vals['Amount_date'] = fields.Datetime.now() 
     res=super(MedicalLab, self).write(vals)   
     record=self.browse(self.ids[0]) 
     self.env['medical.journal'].create({ 
      'patient_id': record.patient_id, 
      'cat': record.cat, 
      'test_type_id': record.test_type_id, 
      'state_money':record.state_money, 
      'Amount_in_date':record.Amount_date, 
      'type_In': "Reste", 
      'Amount_In':record.Amount, 
      'user_id': record.user_id, 
      'type_lev1': "IN",         
     }) 
    return res 
2

'patient_id': vals['patient_id'],

KeyError: 'patient_id'

它只是強調,關鍵是不存在的丘壑,您試圖訪問。因爲你已經通過[]索引訪問它,那麼鍵必須在那裏,如果你想這樣做,那麼你應該嘗試下面的方式。

'patient_id': vals.get('patient_id', False), 

它會首先檢查在字典中的關鍵,如果該鍵沒有找到,那麼就會返回你的下一個參數指定的默認值。建議始終使用get方法。

@Phillip Stack絕對正確,如果字段被修改,您只會在寫入方法中獲得密鑰,否則您將無法在vals中獲得該密鑰。

2

在寫入方法中,我們只獲取實際更改的鍵值。 可能發生的情況是,patient_id未在其中更改。

所以,那就是爲什麼我們沒有從vals字典中獲得這個關鍵值。

試試這個代碼。

在這段代碼中,我試圖從當前的記錄中獲取數據,現在我們沒有在vals字典中獲取密鑰。

@api.multi 
    def write(self, vals): 
     if vals.get('Amount',False) and vals['Amount'] > 0: 
      vals.update({'Amount_date':fields.Datetime.now()) 

      self.env['medical.journal'].create({ 
       'patient_id': vals.get('patient_id',False) and vals['patient_id'] or (self.patient_id and self.patient_id.id or False), 
       'cat': valds.get('cat',False) and vals['cat'] or (self.cat or False), 
       'test_type_id': vals.get('test_type_id',False) and vals['test_type_id'] or (self.test_type_id and self.test_type_id.id or False), 
       'state_money':vals.get('state_money',False) and vals['state_money'] or (self.state_money or False), 
       'Amount_in_date':vals.get('Amount_date',False) and vals['Amount_date'] or (self.Amount_date or False), 
       'type_In': "Reste", 
       'Amount_In':vals.get('Amount',False) and vals['Amount'] or (self.Amount or False), 
       'user_id': vals.get('user_id',False) and vals['user_id'] or (self.user_id and self.user_id.id or False), 
       'type_lev1': "IN",         
      }) 

     return super(MedicalLab, self).write(vals)