【问题标题】:How to fix KeyError in python --> KeyError: 'compensation_remaining_leaves' [duplicate]如何在 python 中修复 KeyError --> KeyError: 'compensation_remaining_leaves' [重复]
【发布时间】:2019-08-23 08:05:46
【问题描述】:

我的代码有问题,问题是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'] 

【问题讨论】:

  • r.days_compensation_remaining = compensation_legal_leave.get_days( r.id)[compensation_legal_leave.id].get('days_compensation_remaining')
  • 谢谢,它的工作,但现在有另一个问题

标签: python odoo keyerror


【解决方案1】:

您的代码没有任何问题,但这是由于您收到的输入。很多时候我们没有得到想要的值,因此我们应该编写代码,这样当一个键不存在时,我们的代码仍然不会中断并按预期工作。

您应该使用input_obj.get('key', default_value) 语法,即使密钥不存在,它也会帮助您通过,如果不存在,那么您可以提供默认值。还有其他方法可以做到这一点,例如hasattr,这很好解释here

【讨论】:

  • 现在还有一个问题,我会在另一个问题中发布
  • 我的错误:TypeError: unsupported operand type(s) for -: float and NoneType in diff = self.days_compensation_remaining - compensation_legal_leave.get_days( self.id)[compensation_legal_leave.id]['days_compensation_remaining']the line
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多