在 Odoo 开发中,compute
字段是一种强大的工具,用于动态计算字段的值。 然而,有时你可能会遇到这样的情况:计算需要访问一些普通用户无法访问的数据,或者需要跨越访问控制。 这时,compute_sudo=True
标志就派上了用场。 本文将详细介绍 compute_sudo=True
的含义、作用、应用场景以及注意事项。
核心概念:compute
字段和权限
compute
字段:compute
字段是 Odoo 中一种特殊的字段,其值不是直接存储在数据库中,而是通过一个 Python 函数动态计算而来。- 计算权限: 默认情况下,
compute
字段的计算函数会在当前用户的上下文中执行,这意味着函数只能访问当前用户有权限访问的数据。
compute_sudo=True
的作用
- 提升权限:
compute_sudo=True
是一个布尔值标志,当设置为True
时,表示compute
字段的计算函数将在拥有超级用户 (superuser) 权限的环境中执行。 - 访问受限数据: 计算函数可以访问所有数据,包括用户通常无法访问的敏感数据。
- 绕过访问控制: 计算函数会绕过 Odoo 的访问控制规则,读取其他模型的数据。
应用场景
- 计算敏感信息:
- 场景: 需要根据用户的工资、职位等敏感信息计算统计指标。
- 作用: 计算函数可以读取普通用户无法访问的敏感字段。
- 汇总跨模型数据:
- 场景: 需要计算多个模型的数据汇总,但当前用户可能对某些模型没有访问权限。
- 作用: 计算函数可以跨模型访问数据,不受用户访问权限的限制。
- 生成管理报表:
- 场景: 需要生成一些涉及多种数据,但普通用户无法查看的管理报表。
- 作用: 计算函数可以读取所需的各种数据,不受用户权限限制。
使用 compute_sudo=True
的注意事项
- 安全风险:
compute_sudo=True
可以让计算函数绕过访问控制,存在泄漏敏感数据的风险,务必谨慎使用。 - 性能影响: 在超级用户环境下执行计算函数,可能会降低一定的性能。
- 最佳实践: 尽量避免使用
compute_sudo=True
,优先考虑通过调整用户权限或使用其他方式解决问题。 - 仔细审核代码: 使用
compute_sudo=True
的代码,务必进行仔细的安全审核,防止恶意代码。
compute_sudo
的默认值变化 (Odoo v13):
- Odoo v13 之前: 默认值为
False
。 - Odoo v13 及以后: 默认值取决于
store
属性:- 如果
store=True
,则compute_sudo=True
。 - 如果
store=False
,则compute_sudo=False
。
- 如果
- 可覆盖: 始终可以通过显式设置
compute_sudo
属性来覆盖默认值。
代码示例
from odoo import models, fields, apiclass MyModel(models.Model):_name = 'my.model'sensitive_data = fields.Integer(string="敏感数据") # 这个字段普通用户可能没有权限访问computed_value = fields.Integer(string="计算值", compute='_compute_value')@api.depends('sensitive_data')def _compute_value(self):for record in self:# 如果没有设置 compute_sudo=True,会因为用户没有sensitive_data字段的访问权限而报错record.computed_value = record.sensitive_data * 2class MyModelSudo(models.Model):_name = "my.model.sudo"sensitive_data = fields.Integer(string="敏感数据") # 这个字段普通用户可能没有权限访问computed_value = fields.Integer(string="计算值", compute='_compute_value_sudo', compute_sudo=True)@api.depends('sensitive_data')def _compute_value_sudo(self):for record in self:record.computed_value = record.sensitive_data * 2 #计算函数中使用超级用户的权限
MyModel
类:_compute_value
函数可能会因为权限问题而报错。MyModelSudo
类: 使用compute_sudo=True
,_compute_value_sudo
函数可以在超级用户权限下执行,不受访问权限限制。
总结
compute_sudo=True
用于在需要更高权限时执行compute
字段的计算函数。- 它可以访问用户通常无法访问的数据,跨越访问控制。
- 适用于计算敏感信息、汇总跨模型数据、生成管理报表等场景。
- 由于安全风险和性能影响,要谨慎使用,并优先考虑使用其他方式解决问题。
结语
compute_sudo=True
是 Odoo 中一个强大的工具,但在使用时需要格外谨慎,充分了解其潜在的风险和影响