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") (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |