在 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 中一个强大的工具,但在使用时需要格外谨慎,充分了解其潜在的风险和影响
