加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – ValueError预期的单例,Odoo8

发布时间:2020-12-20 11:43:54 所属栏目:Python 来源:网络整理
导读:我一直在Ubuntu 14.04上使用Odoo8中的模块.在基于某些One2many字段保存表单记录时,我遇到了一个奇怪的问题.错误说 ValueErrorExpected singleton: hr.employee.pay.change(84,85) 我的Python代码如下 class hr_employee_pay_change(models.Model): _name='hr
我一直在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记录上循环.自我被重新定义为当前记录

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

@ api.multi

Self将是没有迭代的当前RecordSet.这是默认行为(多个可浏览对象).返回非premitive类型数据(列表,字典,函数)的方法必须使用@ 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",'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")

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读