ODOO 10技术问询:如何将hr员工模型记录迁移至自定义新模型
嘿,针对你在Odoo 10里的两个需求——把员工记录从一个模型迁移到另一个,以及从hr.employee提取记录直接创建自定义模型记录,我给你整理了具体的实现方案,你可以根据自己的实际场景调整:
方案1:批量迁移已有员工记录到自定义新模型
首先假设你的自定义新模型叫x_custom_employee,你需要先在模块里定义好这个模型的字段(比如姓名、邮箱、关联原员工等)。接下来可以写一个批量迁移的方法,一次性把所有已有员工记录同步过去:
from odoo import models, fields, api class CustomEmployee(models.Model): _name = 'x_custom_employee' _description = '自定义员工记录' # 示例字段,根据你的实际需求修改 name = fields.Char('员工姓名', required=True) original_employee_id = fields.Many2one('hr.employee', '原员工记录', readonly=True) work_email = fields.Char('工作邮箱') phone = fields.Char('联系电话') @api.model def batch_migrate_employees(self): """批量迁移hr.employee记录到自定义模型""" # 获取所有未迁移的原员工记录 all_employees = self.env['hr.employee'].search([]) # 先收集需要创建的记录数据,批量创建更高效 new_records = [] for emp in all_employees: # 检查是否已经迁移过,避免重复创建 has_migrated = self.search([('original_employee_id', '=', emp.id)], limit=1) if not has_migrated: new_records.append({ 'name': emp.name, 'original_employee_id': emp.id, 'work_email': emp.work_email, 'phone': emp.phone, # 这里继续添加其他字段的映射关系 }) # 批量创建记录 if new_records: self.create(new_records) return f"成功迁移 {len(new_records)} 条员工记录"
怎么执行这个方法?
- 开启Odoo的开发者模式
- 找到你的
x_custom_employee模型,进入模型的技术视图 - 点击顶部的「执行方法」按钮,输入方法名
batch_migrate_employees,确认执行即可
方案2:实时同步hr.employee记录到自定义模型
如果需要在新增或修改hr.employee记录时,自动在自定义模型里创建/更新对应记录,可以通过继承hr.employee模型来实现:
from odoo import models, api class HrEmployeeInherit(models.Model): _inherit = 'hr.employee' @api.model def create(self, vals): # 先创建原员工记录 new_emp = super(HrEmployeeInherit, self).create(vals) # 同步到自定义模型 self.env['x_custom_employee'].create({ 'name': new_emp.name, 'original_employee_id': new_emp.id, 'work_email': new_emp.work_email, 'phone': new_emp.phone, # 字段映射按需调整 }) return new_emp def write(self, vals): # 先更新原员工记录 result = super(HrEmployeeInherit, self).write(vals) # 找到对应的自定义记录并更新 custom_emp = self.env['x_custom_employee'].search([('original_employee_id', '=', self.id)], limit=1) if custom_emp: update_data = {} # 只更新有变化的字段 if 'name' in vals: update_data['name'] = vals['name'] if 'work_email' in vals: update_data['work_email'] = vals['work_email'] if 'phone' in vals: update_data['phone'] = vals['phone'] # 其他字段同理添加 if update_data: custom_emp.write(update_data) return result
注意事项
- 记得在你的模块
__manifest__.py里添加依赖'hr',确保模块加载顺序正确 - 字段映射一定要和你自定义模型的字段名对应,别写错了
- 如果是批量迁移大量数据,优先用方案1的批量创建方式,比循环单条创建性能好很多
- 操作前先在测试环境验证,避免影响生产数据
内容的提问来源于stack exchange,提问作者Prashanth K
相关产品推荐
相关产品推荐

