如何在Odoo 11中实现exit_control模型关联授权方的动态筛选?
解决Odoo中动态过滤关联字段的问题
嗨,我来帮你搞定这个需求!你想要在exit_control模型里选中学生后,让Given_to_id只显示和该学生关联的授权方,这在Odoo里是非常常见的场景,我给你两种可靠的实现方案:
方案一:使用onchange方法实时更新字段域
这是最直观且可靠的方式,当用户选择student_id时,自动触发方法更新Given_to_id的可选范围:
修改Exit_control模型的代码,添加以下内容:
from odoo import models, fields, api class ExitControl(models.Model): _name = 'aula10.exit_control' _description = 'Exit Control' student_id = fields.Many2one('aula10.student', string='Student') Given_to_id = fields.Many2one('aula10.authorized', string='Given to:') @api.onchange('student_id') def _onchange_student_id(self): # 当选中学生时,过滤出该学生关联的所有授权方 if self.student_id: return { 'domain': { 'Given_to_id': [('id', 'in', self.student_id.authorized_ids.ids)] } } # 未选中学生时,清空域(也可以改成显示所有授权方,把[]换成[()]即可) else: return { 'domain': { 'Given_to_id': [] } }
原理说明
@api.onchange('student_id')装饰器会监听student_id字段的变化,一旦用户选择或切换学生,就会执行这个方法- 方法里通过
self.student_id.authorized_ids.ids获取当前学生关联的所有授权方ID,然后把这些ID作为Given_to_id的过滤条件 - 如果没有选中学生,你可以选择清空可选列表(如上代码),或者改成
[()]来显示所有授权方
方案二:在字段定义中设置动态域
如果你更倾向于直接在字段层面定义过滤规则,可以用lambda表达式实现动态域:
修改Exit_control模型的Given_to_id字段:
Given_to_id = fields.Many2one( 'aula10.authorized', string='Given to:', # 当student_id存在时过滤,否则显示所有 domain=lambda self: [('id', 'in', self.student_id.authorized_ids.ids)] if self.student_id else [()] )
注意事项
- 这种方式在创建新记录时,
student_id为空,会显示所有授权方;选中学生后,会自动过滤 - 部分场景下可能需要手动刷新视图才能生效,所以如果追求实时性,方案一更推荐
额外检查
确保你的多对多关联定义是正确的:
- Student模型的
authorized_ids关联到aula10.authorized - Authorized模型的
authorized_for_ids关联到aula10.student
这两个字段的关联是双向的,确保数据能正确关联起来。
内容的提问来源于stack exchange,提问作者Daniel Ruiz
相关产品推荐
相关产品推荐

