Python 当用户输入已存在的员工(Odoo)时发出警告或错误消息

Python 当用户输入已存在的员工(Odoo)时发出警告或错误消息,python,openerp,odoo-8,Python,Openerp,Odoo 8,如何防止用户输入已存在的员工,如下图所示: 因此,当用户试图输入已经存在的同一员工时,它将发出警告或错误消息 我做了这个函数: class overtime(models.Model): _name = 'overtime.overtime' employee_ids = fields.One2many('overtime.overtime_details', 'overtime_id', string="Employee", readonly=True, states={'

如何防止用户输入已存在的员工,如下图所示:

因此,当用户试图输入已经存在的同一员工时,它将发出警告或错误消息

我做了这个函数:

class overtime(models.Model):
    _name = 'overtime.overtime'

    employee_ids = fields.One2many('overtime.overtime_details', 'overtime_id', string="Employee", readonly=True, states={'draft': [('readonly', False)]})

class overtime_details(models.Model):
    _name='overtime.overtime_details'

     @api.multi
     @api.constrains('employee_id')
     @api.onchange('employee_id')
     def prevent_duplicate(self):
        #import pdb;pdb.set_trace()
        if self.employee_id:
            bruh = self.search([])
            for empy in bruh:
                if self.employee_id.id == empy.employee_id.id:
                    raise osv.except_osv(_('Error!'),_('You Cant Enter Same Employee in One Overtime Request!'))

     nik = fields.Char('NIK', size=250, required=True)
     overtime_id = fields.Many2one('overtime.overtime', string="Overtime", ondelete='cascade')
     job_id = fields.Many2one('hr.job', string="Position", readonly=True)
     employee_id = fields.Many2one('hr.employee', "Employee", required=True, select=True, copy=False
                    , domain="[('department_id', '=', parent.department_id)]")
     ovrtm = fields.Float(compute=attd_check, string='Overtime Hour(s)')
     ttalmtp = fields.Float(compute=overtype_count, string='Total Multiplier')
但是它会循环我保存在数据库中的每个记录,所以我需要帮助,如果我想循环我在那个会话中输入的记录,我应该怎么做?iam正在使用odoo v8

您可以使用插入的“id”作为参数执行“浏览”,而不是“搜索”,并检查获得的记录集,如果该记录集不是空的,则引发异常

大概是这样的:

@api.multi
@api.constrains('employee_id')
@api.onchange('employee_id')
def prevent_duplicate(self):
    if self.employee_id:
        bruh = self.search([('employee_id', '=', self.employee_id.id)])
        if len(bruh):
            raise osv.except_osv(_('Error!'),_('You Cant Enter Same Employee in One Overtime Request!'))

在这里,我通过方法或捕获约束数据库错误来说明可能性:

课时加班(models.Model):
_name='加班。加班'
employee_id=fields.One2many('加班.加班详细信息',
“加班id”,string=“Employee”,
readonly=True,states={'draft':[('readonly',False)])
#不需要使用multi,因为默认情况下它们是multi
@api.onechange(“员工ID”)
@api.Constraints('员工ID')
def防止重复(自我):
#你在这里所做的是错误的
#它总是给你=12,因为你是
#正在计算字符串“employee_id”的长度,而不是
#one2many字段中的记录数
#o2m_size=len(“员工ID”)
o2m_size=len(自我员工ID)
employee\u count=len(self.employee\u id.mapped('employee\u id'))
如果o2m_尺寸!=雇员人数:
引发异常。ValidationError(U8;(“员工已存在!”)
课程详细信息(models.Model):
_name='加班。加班详情'
nik=fields.Char('nik',size=250,required=True)
加班费\u id=fields.manyOne('加班费.加班费',string=“加班费”,ondelete='cascade'))
job\u id=fields.manyOne('hr.job',string=“Position”,readonly=True)
employee_id=fields.manyOne('hr.employee','employee',required=True,select=True,copy=False
,domain=“[('department\u id','=',parent.department\u id)])
ovrtm=fields.Float(compute=attd_check,string='加班小时数〕
ttalmtp=fields.Float(compute=overtype\u count,string='Total Multiplier')
#如果要防止重复
#如果该方法不适用于您,则对其进行约束
_sql_约束=[('unique_employee_加班','unique(加班id,员工id)'),
_(“超时工作的雇员”),]

i尝试过,即使没有已存在的记录集,也会发出警告
@api.multi@api.constraints('employee_id')@api.onchange('employee_id')def prevent_duplicate(self):#导入pdb;pdb.set_trace()如果self.employee_id:bruh=self.browse([self.employee_id.id])在bruh:if len(bruh):提高osv。除了_osv(uu('Error!')之外,u('不能在一个加班请求中输入同一名员工!')
为什么要在“bruh”上循环?尝试删除“为布鲁的empy”。“浏览”为您提供一个记录集,如果没有具有该“id”的记录,则该记录集将为空,否则其长度将为1。这就是为什么我使用了“len(bruh)”,但是你需要在“for”之外这样做,就像我在上面写的那样。我也在bruh的empy中尝试了
而没有
,这是sameMy的错误,“browse”用于当前模型的id。要搜索其他模型的记录存在性,如果当前模型中有关系字段,则必须执行“搜索”(我猜我们是在这种情况下),否则执行浏览,但将查询重定向到所需模型,如:self.env[''].browse([])。我编辑了我的答案。它可以工作,但是
bruh
keep给了我空记录集,并且仍然可以复制。是的,我们在模型中,你是说最新版本是从10版开始的吗?我在问这个问题,因为我在v8上工作,它会工作吗?不,我认为它会工作,有了api。约束应该会工作的。当然,你有没有尝试过它,担心响应太晚,它不工作。每次我输入和删除新记录时,即使没有重复的记录,也会引发错误消息。而且它没有阻止重复记录扫描您输入字段名称和方法,因为它对我来说运行良好
@api.onchange('employee\u id')@api.constraints('employee\u id')def prevent\u dupe(self):o2m\u size=len('employee\u id')employee\u count=len(self.employee\u id.mapped('employee\u id')),如果o2m\u size!=雇员计数:警告={'title':{'Duplicated employee'),'message':{'employee ready exist!'}返回{'warning':warning}
在这里,我编辑了我的问题,并提供了更多详细信息