Как исправить KeyError в python --› KeyError: 'compensation_remaining_leaves'

у меня проблема с моим кодом, проблема KeyError, я потратил часы, но не нашел ошибку, KeyError: days_compensation_remaining

Вот мой код.

Класс и модель:

class HrEmployee(models.Model):
    _inherit = 'hr.employee'

    days_compensation_remaining = fields.Float(
        'Jours de récupération restant',
        compute='_compute_days_compensation_remaining',
        readonly=True,
        inverse='_inverse_days_compensation_remaining',
        help='Nombre total des jours de récupération '
        )

Моя первая функция:

    @api.multi
    def _inverse_days_compensation_remaining(self):
        self.ensure_one()
        days_compensation = self.company_id.days_compensation_holidays_status_id
        if not compensation_legal_leave:
            raise UserError(_("le type de congé pour les jours de récupération n'est pas défini"))
        diff = self.days_compensation_remaining - compensation_legal_leave.get_days(
            self.id)[compensation_legal_leave.id]['days_compensation_remaining']

Если разница больше 0:

if diff > 0:
                leave = self.env['hr.holidays'].create(
                    {
                        'name': 'Allocation for %s' % self.name,
                        'employee_id': self.id,
                        'holiday_status_id': compensation_legal_leave.id,
                        'type': 'add',
                        'holiday_type': 'employee',
                        'number_of_days_temp': diff
                    }
                )
                leave.action_approve()
                if leave.double_validation:
                    leave.action_validate()
            elif diff < 0:
                raise UserError(_('vous ne pouvez pas réduire le nombre de jours'))

Моя вторая функция:

    @api.multi
    def _compute_days_compensation_remaining(self):
        for r in self:
            compensation_legal_leave = r.company_id.days_compensation_holidays_status_id
            if not compensation_legal_leave:
                raise UserError(_("le type de congé pour les jours de récupération n'est pas défini"))
            r.days_compensation_remaining = compensation_legal_leave.get_days(
                r.id)[compensation_legal_leave.id]['days_compensation_remaining'] 

person Nabil Taleb    schedule 02.04.2019    source источник
comment
Спасибо, все работает, но теперь другая проблема   -  person Nabil Taleb    schedule 02.04.2019


Ответы (1)


В вашем коде нет ничего плохого, но это связано с полученным вами вводом. Много раз мы не получаем желаемых значений, поэтому мы должны написать код таким образом, чтобы даже при отсутствии ключа наш код не ломался и работал должным образом.

Вы должны использовать синтаксис input_obj.get('key', default_value), который поможет вам пройти, даже если ключ отсутствует, а если он отсутствует, вы можете указать значение по умолчанию. Есть и другие способы сделать это, такие как hasattr, который очень хорошо объясняет здесь.

person argo    schedule 02.04.2019
comment
теперь есть другая проблема, я напишу в другом вопросе - person Nabil Taleb; 02.04.2019
comment
Моя ошибка: TypeError: неподдерживаемые типы операндов для -: float и NoneType в diff = self.days_compensation_remaining - compensation_legal_leave.get_days( self.id)[compensation_legal_leave.id]['days_compensation_remaining']the line - person Nabil Taleb; 02.04.2019