基于onchange更新One2many表单视图时无法获取全部任务的问题
问题分析
你的核心问题出在两个地方:
- 任务模型存在重复的项目关联字段(
task_aff和project_id),导致关联逻辑混乱; - 当前
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
相关产品推荐
相关产品推荐

