python - 在 odoo13 中创建多条记录失败,但在 odoo12 中通过
问题描述
我有这个功能,可以为员工合同分配多个奖金。
我的特殊问题是,当我调用这个函数时,它会抛出错误,Expected singleton failed to unpack multiple records ...
contract_ids
am using 是一个与模型 hr.contract 相关的 many2many 字段。
我了解单例错误的原因,但每次创建调用都使用 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)
工资模型中引用的代码是这样的
@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
....
推荐阅读
- tomcat - 在客户端连接终止时停止服务器线程
- amazon-web-services - 弹性豆茎不复制单个容器日志
- reporting-services - 在 SSRS 中以 CSV 格式导出时如何在列标题中使用星号 (*) 标记
- java - 如何在 Spring java 中获得 RetryTemplate.execute 的结果?
- spring - 找不到弹簧启动websocket api 404
- javascript - 如何创建自定义 DOM 事件?
- java - getBytes 后的 InputRFC 格式不正确
- ignite - 点燃tomee-webprofile-7.1.0->在Tomee启动报错
- python - 使用 TfidfVectorizer 进行自然语言处理
- docker - Jenkins 在 Docker 容器中运行,但无法在浏览器上启动