You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:50:18