焦点概念:外部标识符(External ID)
在 Odoo 中,model_id:id 和 group_id:id 字段的值,如 my_hostel.model_hostel_hostel 和 my_hostel.group_hostel_manager,并不是直接的数据库 ID,而是外部标识符。
- 外部标识符(External ID)是什么?
- 它是一个字符串,格式为 <module_name>.<unique_name>,例如 my_hostel.model_hostel_hostel。
- 它在整个 Odoo 系统中唯一地标识一个数据库记录。
- 它通常用于在 XML 文件中引用数据库记录,例如在定义访问控制规则时。
- 为什么使用外部标识符?
- 避免硬编码 ID: 使用数据库 ID 最大的问题是,这些 ID 在不同的 Odoo 实例中大概不同。假如直接使用 ID,会导致代码无法跨实例移植。外部标识符则包管了跨实例的唯一性。
- 更易读: 外部标识符使用故意义的名称,而不是难以理解的数字 ID,进步代码可读性。
- 方便模块化: 使用外部标识符,模块之间的关联更加清晰,可以轻松地引用其他模块中的数据。
详细表明 model_id:id 和 group_id:id
- model_id:id
- 作用: 此字段用于指定 访问规则 应用于哪个 模子 (数据库表)。
- 值: 是一个外部标识符,例如 my_hostel.model_hostel_hostel。
- my_hostel: 模块名称。
- model_hostel_hostel: 在 my_hostel 模块中,定义 hostel.hostel 模子时的内部名称 (External ID)。注意,这里不是直接的模子名称 hostel.hostel,而是一个在 ir.model 中表现 hostel.hostel 的记录的名称 (通常以 model_ 开头)。
- 分析过程:
- Odoo 根据点号 (.) 分割外部标识符:my_hostel (模块名) 和 model_hostel_hostel(模子记录名)。
- Odoo 在 ir.model 表中查找 module 字段 等于 my_hostel 而且 name 字段 等于 hostel.hostel (注意:这里是真实的模子名称) 的记录 (实际上,Odoo 内部会根据模块和模子名称生成一个 ir.model 记录)。
- 假如找到匹配的记录,Odoo 将获取该记录的 id 字段 的值,并将其作为 model_id:id 的值,记录到访问控制规则中。
- group_id:id
- 作用: 此字段用于指定 访问规则 应用于哪个 用户组。
- 值: 是一个外部标识符,例如 my_hostel.group_hostel_manager 或 my_hostel.group_hostel_user。
- my_hostel: 模块名称。
- group_hostel_manager 或 group_hostel_user: 在 my_hostel 模块中定义的用户组的内部名称 (External ID)。
- 分析过程:
- Odoo 根据点号 (.) 分割外部标识符:my_hostel (模块名) 和 group_hostel_manager 或 group_hostel_user(用户组记录名)。
- Odoo 在 res.groups 表中查找 module 字段 等于 my_hostel 而且 name 字段 等于 hostel.manager (注意: 这里是用户组名称) 的记录 (实际上,Odoo 内部会根据模块和用户组名称生成一个 res.groups 记录)。
- 假如找到匹配的记录,Odoo 将获取该记录的 id 字段 的值,并将其作为 group_id:id 的值,记录到访问控制规则中。
举例说明
假设在你的 my_hostel 模块中,你定义了 hostel.hostel 模子,而且定义了 hostel.manager 和 hostel.user 这两个用户组。
- ir.model 表中的记录:
Odoo 在你安装 my_hostel 模块时会自动在 ir.model 表中创建一条记录,表现 hostel.hostel 模子:
idmodulemodelname…10my_hostelhostel.hostelmodel_hostel_hostel…假设这条记录的 id 是 10 。那么当 Odoo 分析 my_hostel.model_hostel_hostel 时,就会取 id=10。
- res.groups 表中的记录:
Odoo 在你安装 my_hostel 模块时会自动在 res.groups 表中创建两条记录,表现 hostel.manager 和 hostel.user 这两个用户组:
idmodulename…15my_hostelhostel.manager…16my_hostelhostel.user…
假设这两条记录的 id 分别为 15 和 16。 那么当 Odoo 分析 my_hostel.group_hostel_manager 时,就会取 id=15; 分析 my_hostel.group_hostel_user 时,就会取 id=16。
- 访问规则:
在你的 ir.model.access.csv 文件中,你可以有如许的规则:
- id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
- access_hostel_manager,hostel.manager.access,my_hostel.model_hostel_hostel,my_hostel.group_hostel_manager,1,1,1,1
- access_hostel_user,hostel.user.access,my_hostel.model_hostel_hostel,my_hostel.group_hostel_user,1,0,0,0
复制代码
- access_hostel_manager: 表现 hostel.manager 用户组对 hostel.hostel 模子有读、写、创建和删除的权限。
- access_hostel_user: 表现 hostel.user 用户组对 hostel.hostel 模子只有读的权限。
在数据库中, Odoo 会将规则记录为:
idmodel_idgroup_idperm_readperm_writeperm_createperm_unlink…10151111…10161000
总结
- model_id:id 和 group_id:id 使用外部标识符,而不是数据库 ID,以便跨 Odoo 实例保持同等性。
- Odoo 会根据这些外部标识符在 ir.model 和 res.groups 表中查找对应的记录,并获取其 id 值,从而实现对模子和用户组的引用。
- 这种方式使得访问控制规则更加灵活和可维护。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |