Odoo规则:跨模型验证活动所有者是否在导师学生列表中
Odoo跨模型验证规则解决方案:活动所有者需在导师学生列表中
我明白你遇到的问题了——Odoo的记录规则默认是针对单个模型的,跨模型关联时直接写规则很容易因为域的写法不对导致模型不匹配失效。下面我分**权限控制(导师只能访问自己学生的活动)和数据强制验证(创建/编辑活动时必须符合要求)**两种场景给你具体的解决方案:
一、先明确模型关联字段(关键前提)
首先得把你的模型关联理清楚,假设你的字段是这样的(如果不是,替换成你实际的字段名即可):
Activity模型:有owner_id字段(Many2one关联到Usuario),表示活动的所有者(即学生)Usuario模型:- 学生端:有
mentor_id字段(Many2one关联到Usuario),表示该学生的导师 - 导师端:有
student_ids字段(One2many关联到Usuario,反向字段是mentor_id),表示导师的学生列表
- 学生端:有
二、场景1:用记录规则做权限控制(导师只能看到/操作自己学生的活动)
如果你的需求是限制导师的权限,让他们只能管理自己学生的活动,那可以直接在Activity模型上创建记录规则,核心是用跨模型域语法(通过.关联到关联模型的字段):
创建记录规则步骤:
- 进入Odoo后台 -> 设置 -> 技术 -> 安全 -> 记录规则
- 点击「创建」,填写以下内容:
- 模型:选择你的
Activity模型(比如activity) - 名称:自定义一个清晰的名字,比如「导师仅能访问自己学生的活动」
- 域:根据你的模型关联选择其中一种写法:
- 如果学生有
mentor_id字段:[('owner_id.mentor_id', '=', user.id)] - 如果导师有
student_ids字段:[('owner_id', 'in', user.student_ids.ids)]
- 如果学生有
- 应用于:根据需求选择「全部」「读取」「创建」「写入」「删除」
- 组:选择导师所在的用户组(比如「导师组」),确保规则只对导师生效
- 模型:选择你的
为什么之前的规则失效?
你之前的问题大概率是域的写法错误——直接引用了Usuario模型的字段(比如student_ids),但记录规则是针对Activity模型的,必须通过Activity的关联字段(比如owner_id)跨到Usuario模型,否则Odoo会认为字段不属于当前模型,导致规则不生效。
三、场景2:用模型约束做数据强制验证(创建/编辑时必须符合要求)
如果你的需求是无论谁创建活动,都必须保证活动所有者在对应导师的学生列表中,那光靠记录规则不够,需要在Activity模型的Python代码中添加约束(constraint),强制验证数据正确性:
添加约束代码:
打开Activity模型的Python文件(比如models/activity.py),添加以下代码:
from odoo import models, fields, api, exceptions class Activity(models.Model): _name = 'activity' _description = '活动模型' # 你的现有字段 owner_id = fields.Many2one('usuario', string='活动所有者') # 如果需要指定导师(而不是默认当前用户),可以加这个字段 mentor_id = fields.Many2one('usuario', string='对应导师', default=lambda self: self.env.user) # 约束:验证活动所有者在导师的学生列表中 @api.constrains('owner_id', 'mentor_id') def _check_owner_in_mentor_students(self): for rec in self: # 检查所有者是否在导师的学生列表里 if rec.owner_id not in rec.mentor_id.student_ids: raise exceptions.ValidationError( f"活动所有者「{rec.owner_id.name}」不在导师「{rec.mentor_id.name}」的学生列表中,请重新选择!" )
代码说明:
- 如果你的场景是「创建活动的用户就是导师」,可以简化约束,直接用
self.env.user代替rec.mentor_id - 约束会在创建或编辑活动时自动触发,如果不符合条件,会弹出错误提示阻止保存
四、常见排查点
- 关联字段反向检查:确保
Usuario模型的One2many字段student_ids的反向字段是mentor_id,否则跨模型关联会失效 - 用户组权限:记录规则要正确关联到导师组,否则普通用户也会受到规则限制
- 域语法正确性:跨模型字段必须用
.连接,比如owner_id.mentor_id不能写成mentor_id
内容的提问来源于stack exchange,提问作者Jonxag
相关产品推荐
相关产品推荐

