Odoo 14 如何获取员工当前分配项目并展示在员工信息页面
原代码存在的核心问题
- 计算方法的装饰器使用错误:给compute方法加
@api.model不符合Odoo计算字段的执行逻辑,compute方法接收到的self是可能包含多条记录的记录集,直接单条取值会在批量加载员工列表时触发报错 - 缺少空值兜底逻辑:当员工没有绑定系统用户、或者没有匹配到对应状态的任务时,
employee_task是空记录集,直接调用employee_task.project_id.id会抛出空记录集属性访问的异常 - 数据查询逻辑适配性差:单条任务加
limit=1的逻辑会漏掉员工名下其他关联的项目,也没有做去重处理,没法匹配系统“一个项目分配给多名员工、一名员工可归属多个项目”的规则 - 存在冗余查询:从task里拿到project的关联ID后,再次调用search查project表的操作完全多余,Odoo的关联字段可以直接跨表取值
修正后的可运行代码
在员工对应模型类中调整字段定义和计算方法:
# 员工模型中新增的展示字段 # 如果需要减少每次加载的实时查询开销,可以添加store=True参数将计算值持久化到数据库 project_name = fields.Char( string='关联项目', compute='_compute_get_employee_project' ) # 修正后的计算逻辑 def _compute_get_employee_project(self): # 遍历当前所有待计算的员工记录,不直接操作单条记录 for employee in self: # 对未绑定系统账号的员工直接赋值空值 if not employee.user_id: employee.project_name = '' continue # 检索员工名下所有处于分配状态的任务 assigned_tasks = self.env['project.task'].search([ ('user_id', '=', employee.user_id.id), ('status', '=', 'assigned') ]) # 直接从任务关联字段提取项目名称,自动去重后拼接为文本展示 project_list = assigned_tasks.mapped('project_id.name') unique_projects = list(set(project_list)) employee.project_name = ', '.join(unique_projects)
关键注意事项
- 核对任务状态的匹配规则:如果代码中的
status = 'assigned'是自定义的任务状态字段,请确认字段的实际存储值是否和筛选条件完全匹配;如果使用的是Odoo原生的任务阶段(stage_id)判断状态,需要把筛选条件替换为对应的阶段判断逻辑,否则会出现检索不到数据、字段始终为空的情况 - 交互优化可选:如果需要实现项目名点击直接跳转到对应项目详情页的效果,可以把
Char类型的展示字段替换为Many2many关联字段,直接反向关联任务表的user_id匹配记录,不需要额外编写计算逻辑 - 性能适配:如果员工数据量较大,给计算字段加
store=True参数后,系统会在关联的任务、项目字段变更时自动重新触发计算,避免每次加载员工页面都做全量搜索拖慢性能
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

