python – ValueError预期的单例,Odoo8
|
我一直在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',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',track_visibility='always')
我无法解决这个问题.我试图删除该字段的’readonly = True’属性,问题得到解决,但我需要将它们作为readonly.希望提出建议 解决方法
预期单身人士:
类方法需要单个调用对象(Single Browsable Record)来调用方法并假设它将通过多个调用对象(可浏览记录集)调用,然后方法无法识别它应该处理哪个对象,因此它会引发错误Expected Singleton . 新的API装饰器用于定义方法调用模式,方法是否只允许单个对象或多个对象调用此方法. @ api.one 此装饰器会自动在RecordSet记录上循环.自我被重新定义为当前记录 注意: @ api.multi Self将是没有迭代的当前RecordSet.这是默认行为(多个可浏览对象).返回非premitive类型数据(列表,字典,函数)的方法必须使用@ api.multi进行修饰 @ api.model 此装饰器将旧的API调用转换为装饰函数,以转换为新的API签名.它允许礼貌的时候 所以简单地这样打电话 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",'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')
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',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")
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
