无需onchange函数为Many2one字段设置动态域问题求助
问题分析与解决方案
原代码无法正常运行的核心原因是:直接将实例方法赋值给domain参数时,该方法会在模型定义阶段一次性执行,而非针对每条记录的is_bus_registered实时值动态计算,因此无法实现随布尔字段切换而更新域的效果。此外,手动执行search获取ID列表的方式属于冗余操作,Odoo的域本身支持直接使用数据库查询条件,无需提前查询。
修正后的代码
is_bus_registered = fields.Boolean( string='Bus Registered', required=False ) att_policy_id = fields.Many2one( 'hr.attendance.policy', string='Attendance Policy', domain=lambda self: [('is_bus_registered', '=', self.is_bus_registered)] )
关键说明
- 使用lambda函数作为
domain参数,Odoo会针对每条记录实时计算域条件,自动根据当前记录的is_bus_registered值,过滤出对应匹配的hr.attendance.policy选项。 - 直接在域中使用字段匹配条件,替代原代码中先查询再取ID的逻辑,既减少数据库查询次数,又符合Odoo的域设计规范。
- 该方案无需依赖
onchange函数,表单中切换布尔字段状态时,Many2one字段的可选列表会自动更新。
内容的提问来源于stack exchange,提问作者omar ahmed
相关产品推荐
相关产品推荐

