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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 14:45:03