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

基于onchange更新One2many表单视图时无法获取全部任务的问题

问题分析

你的核心问题出在两个地方:

  1. 任务模型存在重复的项目关联字段(task_aff和project_id),导致关联逻辑混乱;
  2. 当前onchange方法依赖关联字段的缓存数据,没有主动从数据库拉取最新任务记录,且错误地创建任务副本而非直接关联已有任务。
解决方案

根据你的需求,分两种场景给出对应修改方案:


场景1:直接在项目表单中查看/编辑关联任务(无需复制)

这种场景下根本不需要project_id_for_project字段和onchange方法,只需正确配置双向关联字段即可自动同步任务:

项目模型修改

class project(models.Model):
    _name = 'project.project'
    _description = 'project.project'

    # 直接绑定任务模型的project_id字段,自动显示所有关联该项目的任务
    project_task_aff = fields.One2many('tasks.tasks', 'project_id', string='关联任务')

任务模型修改

class tasks(models.Model):
    _name = 'tasks.tasks'
    _description = 'tasks.tasks'
    _inherit = ['mail.thread', 'mail.activity.mixin']

    task_actor = fields.Many2one('res.users', string='Chauffeur')
    # 保留唯一的项目关联字段,与项目的One2many双向绑定
    project_id = fields.Many2one('project.project', string='所属项目')
    name = fields.Char()
    DATE_tsk = fields.Date()
    Description = fields.Char()

配置完成后,项目表单的project_task_aff字段会自动显示所有关联该项目的已保存任务,无需额外代码。


场景2:从其他项目复制任务到当前项目

如果你的需求是通过选择目标项目,将其任务复制到当前项目,修改onchange方法直接从数据库拉取最新任务:

项目模型修改

class project(models.Model):
    _name = 'project.project'
    _description = 'project.project'

    project_id_for_project = fields.Many2one('project.project', string='选择要复制任务的项目')
    project_task_aff = fields.One2many('tasks.tasks', 'project_id', string='关联任务')

    @api.onchange('project_id_for_project')
    def getone2manyproject(self):
        for rec in self:
            lines = []
            if rec.project_id_for_project:
                # 直接从数据库搜索目标项目的所有任务,确保获取最新数据
                target_tasks = self.env['tasks.tasks'].search([('project_id', '=', rec.project_id_for_project.id)])
                # 复制任务属性并关联到当前项目
                for task in target_tasks:
                    val = {
                        'task_actor': task.task_actor.id,
                        'name': task.name,
                        'DATE_tsk': task.DATE_tsk,
                        'Description': task.Description,
                        'project_id': rec.id,
                    }
                    lines.append((0, 0, val))
            rec.project_task_aff = lines

任务模型修改

同场景1,删除冗余的task_aff字段,保留project_id作为唯一关联字段。


关键注意事项
  • 必须保证项目与任务的关联字段唯一且对应,避免冗余字段导致逻辑混乱;
  • 未保存的任务仅存在于当前表单会话中,无法被其他视图的onchange方法获取,必须先保存任务才能被检索到;
  • 区分关联已有任务和复制任务创建新记录:关联用(4, task.id),创建新记录用(0, 0, val)。

内容的提问来源于stack exchange,提问作者Sadiki Ayoub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:11:29