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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:41:12