Odoo批量给所有员工创建假期报错:Expected singleton问题
解决Odoo批量给全体员工创建假期的报错问题
嗨,我来帮你搞定这个问题!你遇到的Expected singleton: hr.employee(...)错误,其实是个很常见的Odoo记录集使用误区:
当你用self.env['hr.employee'].search([]).id时,search([])返回的是所有员工的记录集,而.id属性只有在记录集是单条记录(singleton)时才能正常使用。多条记录直接取.id,Odoo就会懵圈——它不知道你要的是哪一个员工的ID,所以抛出了这个错误。
下面是修正后的完整代码,我还调整了一些逻辑细节,确保能正确给所有员工批量创建假期:
@api.multi def appliquer(self): # 获取系统内所有员工的完整记录集,直接遍历即可 all_employees = self.env['hr.employee'].search([]) created_holidays = [] # 遍历当前操作的假期模板(@api.multi下self是当前选中的记录集) for template in self: # 给每个员工创建一条假期记录 for emp in all_employees: vals = { 'name': template.name, 'employee_id': emp.id, 'holiday_status_id': template.type.id, 'date_from': template.date_f, 'date_to': template.date_t, 'number_of_days_temp': template.nbr_days, 'toapprouve': True, # 布尔字段要传Python的True/False,不是字符串'true' } holiday = self.env['hr.holidays'].create(vals) created_holidays.append(holiday) # 返回所有创建成功的假期记录集,方便后续操作 return self.env['hr.holidays'].browse([holiday.id for holiday in created_holidays])
关键修改说明:
- 去掉
.id直接遍历记录集:用all_employees = self.env['hr.employee'].search([])拿到所有员工的记录集,直接遍历每个员工对象,避免singleton错误 - 调整循环逻辑:先遍历当前的假期模板(
self),再逐个给员工创建假期,逻辑更清晰 - 修正布尔字段赋值:把
'toapprouve':'true'改成True,Odoo的布尔型字段需要传入Python原生布尔值,字符串会导致字段值不生效 - 返回完整记录集:收集所有创建的假期记录并返回,而不是只返回最后一条,方便后续跟踪或扩展功能
这样修改后,执行appliquer方法就能直接给全体员工分配假期,完全不需要依赖标签啦。
内容的提问来源于stack exchange,提问作者imad
相关产品推荐
相关产品推荐

