如何在Odoo中设置data files对应的记录为用户不可删除状态
Odoo导入受保护记录及删除权限限制实现方案
一、导入包含已有记录的data文件配置
针对不同格式的导入文件,优先配置数据保护标记,避免后续被模块升级覆盖,同时为权限限制做标识:
- 若使用XML格式的模块内置数据:在
<data>标签添加noupdate="1"属性,标签内定义的所有记录导入后会被标记为受保护数据,模块升级时不会被覆盖,示例结构:
<odoo> <data noupdate="1"> <!-- 你的已有记录定义 --> <record id="existing_record_001" model="your.target.model"> <field name="name">测试记录</field> </record> </data> </odoo>
- 若使用CSV/Excel格式手动导入:可先给目标模型新增一个布尔类型的自定义字段
is_protected,默认值为False,导入数据时批量将该字段的值设为True,作为受保护记录的标识。 - 若使用CSV格式作为模块内置数据:在模块的
__manifest__.py文件中,将对应CSV文件路径放入noupdate节点下,即可实现和XML加noupdate="1"相同的效果。
二、普通用户删除权限限制实现
推荐两种实现方案,可根据你的技术能力选择:
方案1:配置记录规则(无需改代码,适合运维人员)
- 开启Odoo开发者模式,依次进入「设置」-「技术」-「安全」-「记录规则」
- 新建记录规则,选择你要限制的目标模型,例如导入的是客户数据就选
res.partner - 规则域名填写:
[('is_protected', '=', True)],如果是模块内置的noupdate标记数据,可填写[('id', 'in', ir_model_data().search([('model', '=', 'your.target.model'), ('noupdate', '=', True)]).mapped('res_id'))] - 权限配置项中仅取消「删除」权限的勾选,适用组选择要限制的普通用户组(例如内部用户组),管理员组不要关联该规则,保证管理员可正常操作。
- 保存规则后生效,普通用户删除受保护记录时会直接触发权限报错。
方案2:重写unlink方法(限制更严谨,适合开发人员)
在自定义模块中继承目标业务模型,重写删除方法增加权限校验,代码示例:
from odoo import models, exceptions class TargetModel(models.Model): _inherit = 'your.target.model' def unlink(self): # 仅校验非系统管理员的操作 if not self.env.user.has_group('base.group_system'): # 筛选当前要删除的记录中包含的受保护记录 protected_recs = self.filtered(lambda x: x.is_protected) if protected_recs: raise exceptions.UserError('您没有权限删除系统导入的受保护记录,请联系管理员处理') return super(TargetModel, self).unlink()
代码部署后升级自定义模块即可生效,普通用户触发删除受保护记录操作时会直接抛出提示。
注意事项
- 导入已有记录前请确认记录的外部ID(External ID)和系统现有记录匹配,避免生成重复数据
- 所有权限限制都不对系统管理员生效,避免出现异常受保护数据无法清理的问题
- 如需灵活调整记录保护状态,可给管理员配置
is_protected字段的编辑权限
内容的提问来源于stack exchange,提问作者ricardo chirinos
相关产品推荐
相关产品推荐

