在odoo13中创建多个记录失败,但在odoo12中通过

问题描述

我有这个功能,可以向员工合同分配多个奖金。

我的特殊问题是,当我调用此函数时,它将引发错误Expected singleton failed to unpack multiple records ...

正在使用的contract_ids是一个与模型hr.contract有关的many2many字段。

我了解单例错误的原因,但在每个create调用中都使用了for循环,所以我不知道错误在哪里。

  def action_allocate_bonus(self):
        for rec in self.contract_ids:
            vals = {
                'contract_id': rec.id,'cash_allowance_id': self.cash_allowance_id.id,'computation': 'fixed','fixed': rec.allowance_amount,}
            self.env['ke.cash_allowances'].sudo().create(vals)

这是实际的日志错误:

Odoo Server Error
Traceback (most recent call last):
  File "/home/b14/odoo-dev/odoo13/odoo/models.py",line 5000,in ensure_one
    _id,= self._ids
ValueError: too many values to unpack (expected 1)

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "/home/b14/odoo-dev/odoo13/odoo/http.py",line 624,in _handle_exception
    return super(JsonRequest,self)._handle_exception(exception)
  File "/home/b14/odoo-dev/odoo13/odoo/http.py",line 310,in _handle_exception
    raise pycompat.reraise(type(exception),exception,sys.exc_info()[2])
  File "/home/b14/odoo-dev/odoo13/odoo/tools/pycompat.py",line 14,in reraise
    raise value
  File "/home/b14/odoo-dev/odoo13/odoo/http.py",line 669,in dispatch
    result = self._call_function(**self.params)
  File "/home/b14/odoo-dev/odoo13/odoo/http.py",line 350,in _call_function
    return checked_call(self.db,*args,**kwargs)
  File "/home/b14/odoo-dev/odoo13/odoo/service/model.py",line 94,in wrapper
    return f(dbname,**kwargs)
  File "/home/b14/odoo-dev/odoo13/odoo/http.py",line 339,in checked_call
    result = self.endpoint(*a,**kw)
  File "/home/b14/odoo-dev/odoo13/odoo/http.py",line 915,in __call__
    return self.method(*args,line 515,in response_wrap
    response = f(*args,**kw)
  File "/home/b14/odoo-dev/odoo13/addons/web/controllers/main.py",line 1326,in call_button
    action = self._call_kw(model,method,args,kwargs)
  File "/home/b14/odoo-dev/odoo13/addons/web/controllers/main.py",line 1314,in _call_kw
    return call_kw(request.env[model],kwargs)
  File "/home/b14/odoo-dev/odoo13/odoo/api.py",line 388,in call_kw
    model.flush()
  File "/home/b14/odoo-dev/odoo13/odoo/models.py",line 5389,in flush
    self.recompute()
  File "/home/b14/odoo-dev/odoo13/odoo/models.py",line 5808,in recompute
    process(field)
  File "/home/b14/odoo-dev/odoo13/odoo/models.py",line 5792,in process
    recs.mapped(field.name)
  File "/home/b14/odoo-dev/odoo13/odoo/models.py",line 5206,in mapped
    recs = recs._mapped_func(operator.itemgetter(name))
  File "/home/b14/odoo-dev/odoo13/odoo/models.py",line 5165,in _mapped_func
    vals = [func(rec) for rec in self]
  File "/home/b14/odoo-dev/odoo13/odoo/models.py",in <listcomp>
    vals = [func(rec) for rec in self]
  File "/home/b14/odoo-dev/odoo13/odoo/models.py",line 5616,in __getitem__
    return self._fields[key].__get__(self,type(self))
  File "/home/b14/odoo-dev/odoo13/odoo/fields.py",line 997,in __get__
    self.compute_value(recs)
  File "/home/b14/odoo-dev/odoo13/odoo/fields.py",line 1111,in compute_value
    records._compute_field_value(self)
  File "/home/b14/odoo-dev/odoo13/odoo/models.py",line 3915,in _compute_field_value
    getattr(self,field.compute)()
  File "/home/b14/odoo-dev/odoo13/custom-addons/hr_ke/models/payroll.py",line 485,in compute_cash_allowance
    if self.computation == 'fixed':
  File "/home/b14/odoo-dev/odoo13/odoo/fields.py",line 984,in __get__
    record.ensure_one()
  File "/home/b14/odoo-dev/odoo13/odoo/models.py",line 5003,in ensure_one
    raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: ke.cash_allowances(33,34)

工资模型中引用的代码是这个

@api.depends('computation','fixed')
def compute_deduction(self):
    if self.computation == 'fixed':
        self.amount = self.fixed

    elif self.computation == 'formula':
        baselocaldict = {
            'result': None,'employee': self.employee_id,'deduction': self}
        localdict = dict(baselocaldict)
        try:
            Eval(self.formula,localdict,mode='exec',nocopy=True)
        except BaseException:
            raise ValidationError(
                    _('Error in the formula defined for this\
                      deduction: %s\n [%s].') %
                    (self.name,self.formula))
        self.amount = localdict['result']
    else:
        self.amount = 0.00

解决方法

似乎是导致错误的“自我”,它是一组多个记录,但被称为单个记录。 更具体地说,在compute_deduction的第一行中,它已经遇到了一个问题,即它不知道computation字段应该为2个不同的字段返回什么。 我认为您可能希望将整个方法放在for循环中,然后使用记录而不是self。 像这样:

@api.depends('computation','fixed')
def compute_deduction(self):
    for record in self:
        if record.computation == 'fixed':
            record.amount = record.fixed
        ....

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...