【问题标题】:AttributeError: 'bool' object has no attribute?AttributeError:“布尔”对象没有属性?
【发布时间】:2017-06-22 14:22:31
【问题描述】:

这是我的功能:

    @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' 对象没有属性 'patient_id'

编辑:

    @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'

【问题讨论】:

  • record 原来是一个布尔值...你确定 super(MedicalLab, self).write(vals) 返回一个对象/字典吗?而不仅仅是一个表示成功的布尔值?
  • 这指向super(MedicalLab, self).write 方法。您似乎期望它返回布尔值以外的其他内容。您是否有权访问其实施或文档?
  • 修改MedicalLab后,我需要为medical.journal创建一条记录
  • 打印 vals 并检查其中是否存在 Patient_id?

标签: python openerp odoo-10


【解决方案1】:

如果您不修改字段 patient_id,它将不会在 vals 字典中传递。如果没有在 UI 中分配 patient_id,它将被正确分配一个 False 值。如果您打印 vals 字典并查看您的日志或标准输出,您应该会发现 patient_id 很可能是 False ,表明它没有被分配。在访问它的属性之前,我可能会做一些评估。

 'patient_id': vals['patient_id'] if vals.get('patient_id') else False,

【讨论】:

    【解决方案2】:

    'patient_id': vals['patient_id'],

    KeyError: 'patient_id'

    它只是突出显示 vals 中不存在密钥并且您正在尝试访问。因为您已经通过 [ ] 索引访问了它,所以 key 必须在那里,如果您想这样做,那么您应该尝试以下方式。

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

    如果没有找到该键,它将首先检查字典中的键,然后它将返回您在下一个参数中指定的默认值。建议始终使用 get 方法。

    @Phillip Stack 是绝对正确的,如果字段被修改,您只会在 write 方法中获得密钥,否则您将无法在 vals 中获得该密钥。

    【讨论】:

      【解决方案3】:

      在 write 方法中,我们只获取实际更改的键值。 可能会发生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)
      

      【讨论】:

        【解决方案4】:
        @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 
        

        方法“write”没有返回任何东西,你可以参考https://www.odoo.com/documentation/10.0/reference/orm.html#odoo.models.Model.write,所以如果你想在写完后得到最新的数据,最好重新浏览数据然后创建medicallab,所以我建议:

        @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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-06-14
          • 1970-01-01
          • 2012-12-01
          • 2021-04-19
          • 2021-11-22
          • 1970-01-01
          • 1970-01-01
          • 2018-11-22
          相关资源
          最近更新 更多