gpt4 book ai didi

python - ValueError 预期单例,Odoo8

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:41 25 4
gpt4 key购买 nike

我一直在 Ubuntu 14.04 上的 Odoo8 中开发一个模块。在保存基于某些 One2many 字段的表单记录时,我遇到了一个奇怪的问题。错误说

ValueError

Expected singleton: hr.employee.pay.change(84, 85)

我的Python代码如下

class hr_employee_pay_change(models.Model):

_name='hr.employee.pay.change'
hr_payroll_change_ids = fields.Many2one("employee.salary.change", "Employee", ondelete="cascade")

@api.onchange('emp_basic', 'emp_allowance')
@api.depends('emp_basic', 'emp_allowance')
def _current_total(self):
self.emp_current_total = self.emp_basic + self.emp_allowance



@api.onchange('emp_propose_allowance', 'emp_propose_basic')
@api.depends('emp_propose_allowance', 'emp_propose_basic')
def _proposed_total(self):
data_val={}
self.emp_propose_total = self.emp_propose_basic + self.emp_propose_allowance
cr=self._cr
uid=self._uid
ids=self._ids
val=int(self.employee_name)
if val:
cr.execute("select max_salary,min_salary from hr_job where id in (select job_id from hr_employee where id='"+str(val)+"')")
res=cr.fetchall()
for data_val in res:
max_sal=data_val[0]
min_sal=data_val[1]
if not min_sal < self.emp_propose_total < max_sal:
self.emp_propose_basic = 0.0
self.emp_propose_allowance = 0.0
return {'warning':{'title':'warning','message':'Out of Range, Proposed Total must be in between "'+str(max_sal)+'"to"'+str(min_sal)+'"'}}
else:
cr.execute("select wage from hr_contract where employee_id=0")




@api.onchange('employee_name')
@api.depends('employee_name')
def get_data(self):
data={}
cr=self._cr
uid=self._uid
ids=self._ids
value=int(self.employee_name)
if(self.employee_name):
cr.execute("select wage,allowance from hr_contract where employee_id ='"+str(value)+"'")
res=cr.fetchall()
for data in res:
self.emp_basic=data[0]
self.emp_allowance = data[1]

else:
cr.execute("select wage,allowance from hr_contract where employee_id=0")



employee_name = fields.Many2one('hr.employee', 'Employee Name', required=True )
zeo_number = fields.Char(related='employee_name.zeo_number', string='ZEO Number', readonly=True )
emp_basic = fields.Float('Basic Salary', compute='get_data',readonly=True, store=True )
emp_allowance = fields.Float('Allowance', compute='get_data',readonly=True, store=True )
emp_current_total = fields.Float('Totals', compute='_current_total', store=True, track_visibility='always')
emp_propose_basic = fields.Float('Proposed Basic')
emp_propose_allowance = fields.Float('Proposed Allowance')
emp_propose_total = fields.Float('Proposed Totals', compute='_proposed_total', store=True, track_visibility='always')

我无法解决这个问题。我试图删除该字段的 'readonly=True' 属性,问题得到解决,但我需要将它们设置为 readonly 。望指教

最佳答案

预期的单例:

类方法需要单个调用对象(单个可浏览记录)来调用该方法,假设它将被多个调用对象(可浏览记录集)调用,则方法无法确定它应该处理哪个对象,因此它会引发错误 Expected Singleton

新的 API 装饰器用于定义方法调用模式,方法是否只允许单个对象或多个对象调用此方法。

@api.one

此装饰器会自动为您在 RecordSet 的 Records 上循环。 self 被重新定义为当前记录

注意:注意:返回值放在列表中。 Web 客户端并不总是支持这一点,例如按钮 Action 方法。在这种情况下,您应该使用 @api.multi 来装饰您的方法,并可能调用 self.ensure_one()方法定义。

@api.multi

Self 将是没有迭代的当前 RecordSet。这是默认行为(多个可浏览对象)。返回非前提类型数据(列表、字典、函数)的方法必须用 @api.multi

修饰

@api.model

这个装饰器会将旧的 API 调用转换为装饰函数到新的 API 签名。它允许礼貌时迁移代码。 Self 不包含此装饰器装饰的方法中的任何记录/记录集。

所以简单地这样调用

self.env['model_name'].method_name(参数)

你应该尝试跟随,

class hr_employee_pay_change(models.Model):
_name='hr.employee.pay.change'
hr_payroll_change_ids = fields.Many2one("employee.salary.change", "Employee", ondelete="cascade")

@api.onchange('emp_basic', 'emp_allowance')
@api.depends('emp_basic', 'emp_allowance')
def _current_total(self):
for rec in self:
rec.emp_current_total = rec.emp_basic + rec.emp_allowance

@api.onchange('emp_propose_allowance', 'emp_propose_basic')
@api.depends('emp_propose_allowance', 'emp_propose_basic')
def _proposed_total(self):
for rec in self:
data_val={}
rec.emp_propose_total = rec.emp_propose_basic + rec.emp_propose_allowance
cr=self._cr
uid=self._uid
ids=self._ids
val=int(rec.employee_name)
if val:
cr.execute("select max_salary,min_salary from hr_job where id in (select job_id from hr_employee where id='"+str(val)+"')")
res=cr.fetchall()
for data_val in res:
max_sal=data_val[0]
min_sal=data_val[1]
if not min_sal < self.emp_propose_total < max_sal:
self.emp_propose_basic = 0.0
self.emp_propose_allowance = 0.0
return {'warning':{'title':'warning','message':'Out of Range, Proposed Total must be in between "'+str(max_sal)+'"to"'+str(min_sal)+'"'}}
else:
cr.execute("select wage from hr_contract where employee_id=0")

@api.onchange('employee_name')
@api.depends('employee_name')
def get_data(self):
for rec in self:
data={}
cr=self._cr
uid=rec._uid
ids=rec._ids
value=int(rec.employee_name)
if(rec.employee_name):
cr.execute("select wage,allowance from hr_contract where employee_id ='"+str(value)+"'")
res=cr.fetchall()
for data in res:
rec.emp_basic=data[0]
rec.emp_allowance = data[1]

else:
cr.execute("select wage,allowance from hr_contract where employee_id=0")

关于python - ValueError 预期单例,Odoo8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31070640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com