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

Python 在odoo13中创建多个记录失败,但在odoo12中通过,python,odoo,odoo-12,odoo-13,Python,Odoo,Odoo 12,Odoo 13,我有一个函数,可以将多个奖金分配给员工合同 我的特殊问题是,当我调用此函数时,它会抛出错误,Expected singleton未能解压缩多个记录… contract\u idam using是一个与模型hr.contract相关的多个字段 我理解单例错误的原因,但是我对每个create调用都使用for循环,所以我不知道我的错误在哪里 def action_allocate_bonus(self): for rec in self.contract_ids:

我有一个函数,可以将多个奖金分配给员工合同

我的特殊问题是,当我调用此函数时,它会抛出错误,
Expected singleton未能解压缩多个记录…

contract\u id
am using是一个与模型hr.contract相关的多个字段

我理解单例错误的原因,但是我对每个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, *args, **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, **kw)
  File "/home/b14/odoo-dev/odoo13/odoo/http.py", 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], method, args, 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", line 5165, 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)

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

@api.dependens('计算','固定')
def计算扣除额(自):
请自行记录:
如果record.computation=='fixed':
record.amount=record.fixed
....

如果您使用的是odoo12,请在上添加@api.multi decoratormethod@AdamStrauss,我使用的是ODOO13请使用日志错误更新您的问题Yes@Kenly说的是正确的事情…问题在于当您尝试在
中获取
计算的值时,如果self.computation='fixed':
。您需要在
self
上循环以获取字段值。您可以查看文档
@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