属性错误:'bool'对象没有属性?

3
这是我的函数:

    @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  

这是错误信息:

属性错误:'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'],

键错误:'patient_id'


1
“record”原来是一个布尔值……你确定super(MedicalLab, self).write(vals)返回的是一个对象/字典吗?而不仅仅是表示成功的布尔值? - Willem Van Onsem
这指向super(MedicalLab, self).write方法。你似乎期望它返回除布尔值以外的其他内容。你有它的实现或文档吗? - Nathan.Eilisha Shiraini
我需要在修改 MedicalLab 后为 medical.journal 创建一条记录。 - Borealis
打印 vals 并检查患者 ID 是否存在于其中? - Alpesh Valaki
4个回答

4

如果您不修改patient_id字段,则不会在vals字典中传递它。如果在用户界面中尚未分配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中没有'patient_id'这个键,但你却试图访问它。因为你是通过[ ]索引来访问的,所以如果要这样做,那么该键必须存在,你可以尝试以下方法:

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

它首先会在字典中检查键,如果未找到键,则会返回下一个参数中指定的默认值。建议始终使用get方法。

@Phillip Stack完全正确,如果字段未被修改,则只有在write方法中才能获取该键,否则您将无法在vals中获得该键。


2
在write方法中,我们只能获得实际更改的键值。可能会出现patient_id没有被更改的情况。
所以,我们无法从vals字典中获取该键值。
尝试使用以下代码。
在这段代码中,我尝试从当前记录(即self)中获取数据,当我们无法从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)

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 

"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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接