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' не имеет атрибута '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)

новая ошибка:

'id_пациента': vals['id_пациента'],

KeyError: 'пациент_id'


person Borealis    schedule 22.06.2017    source источник
comment
Ну, record оказывается логическим... Вы уверены, что super(MedicalLab, self).write(vals) возвращает объект/словарь? А не просто логическое значение, указывающее на успех?   -  person Willem Van Onsem    schedule 22.06.2017
comment
Это указывает на метод super(MedicalLab, self).write. Кажется, вы ожидаете, что он вернет что-то еще, кроме логического значения. Есть ли у вас доступ к его реализации или документации?   -  person Nathan.Eilisha Shiraini    schedule 22.06.2017
comment
Мне нужно создать запись для medical.journal, как только я изменю MedicalLab   -  person Borealis    schedule 22.06.2017
comment
распечатайте vals и проверьте, существует ли в нем идентификатор пациента?   -  person Alpesh Valaki    schedule 22.06.2017


Ответы (4)


Если вы не изменяете полеpatient_id, оно не будет передано в словарь vals. Если идентификатор пациента не был назначен в пользовательском интерфейсе, ему будет правильно присвоено значение False. Если вы распечатаете словарь vals и просмотрите свои журналы или стандартный вывод, вы обнаружите, что параметр пациента_id, вероятно, имеет значение False, указывающее, что он не был назначен. Я мог бы сделать некоторую оценку, прежде чем получить доступ к его атрибутам.

 'patient_id': vals['patient_id'] if vals.get('patient_id') else False,
person Phillip Stack    schedule 22.06.2017

'id_пациента': vals['id_пациента'],

KeyError: 'пациент_id'

Он просто подчеркивает, что в vals нет ключа, и вы пытаетесь получить доступ. Поскольку вы получили к нему доступ через индексы [ ], ключ должен быть там, если вы хотите это сделать, вам следует попробовать следующий способ.

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

Сначала он проверит ключ в словаре, если ключ не найден, а затем вернет значение по умолчанию, которое вы указали в следующем аргументе. Рекомендуется всегда использовать метод get.

@Phillip Stack абсолютно прав, вы получите ключ в методе записи только в том случае, если поле будет изменено, иначе вы не получите этот ключ в vals.

person Emipro Technologies Pvt. Ltd.    schedule 23.06.2017

В методе записи мы получаем только значение ключа, которое фактически изменено. Может случиться так, что в ней не изменился идентификатор пациента.

Вот почему мы не получаем это значение ключа из словаря 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)
person Chavada Viki    schedule 23.06.2017

@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, поэтому, если вы хотите получить последние данные после записи, лучше повторно - просмотреть данные, затем создать медицинскую лабораторию, поэтому я предлагаю:

@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
person Stone    schedule 23.06.2017