如何解决在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
....
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。