如何创建判断用户ID在多对多字段中的Odoo权限规则
解决Odoo多对多字段的权限域规则性能问题
嘿,这个场景我太熟悉了!你之前用反向字段的写法虽然能跑,但确实会在用户关联大量记录时拖慢查询——毕竟每次都要先把用户所有的test.model记录ID拉出来再做IN匹配,数据量大的时候SQL语句会变得很长,性能肯定受影响。
其实Odoo的域规则本身就支持直接判断当前用户是否在多对多字段的关联集合里,完全不需要依赖反向字段,而且这种写法的性能要好得多!
正确的域规则写法
你只需要把原来的域规则改成下面这样:
<record model="ir.rule" id="test_rule"> ... <field name="domain_force">[('user_ids', 'in', [user.id])]</field> ... </record>
甚至你可以把之前在res.users里添加的test_ids反向字段删掉了,这个域规则完全不需要它。
为什么这个写法更高效?
原来的[('id', 'in', user.test_ids)]会先执行一次查询,把当前用户关联的所有test.model记录ID捞出来,然后生成一个带超长IN子句的SQL查询。而新的写法会让Odoo直接生成关联中间表的JOIN查询:它会自动关联test_user_relation中间表,筛选出其中user_id等于当前用户ID的test_id,这种查询可以充分利用数据库索引,性能比前者高出一大截,就算用户关联几千条记录也不会有明显的性能问题。
额外说明
这种用法是Odoo官方支持的,很多内置模块里都有类似的实现——比如销售模块里的多用户分配权限,或者项目模块里的任务共享权限,都是用这种方式来做的。
内容的提问来源于stack exchange,提问作者Benjamín Holloway
相关产品推荐
相关产品推荐

