加载演示数据时无法创建Partner的惯用技术解决方案咨询
解决方案
针对Odoo模块安装时因权限组未分配导致演示数据创建失败的问题,以下是几种惯用的技术解决方法:
1. 跳过演示数据/安装模式下的权限校验
在create方法中增加判断,当处于模块安装模式或加载演示数据时,跳过权限校验。Odoo会在安装模块或加载演示数据时自动在上下文中传入install_mode或demo标志,利用这一点修改代码:
@api.model def create(self, vals_list): # 仅在非安装/非演示数据场景下校验权限 if not self.env.context.get('install_mode') and not self.env.context.get('demo'): if not self.env.user.has_group('some-project.group_super') and not self.env.user.has_group('some-project.group_some_role'): raise ValidationError("Some error message.") vals_list['serial_number_for_this_entity'] = self.env['ir.sequence'].next_by_code('some_project.res.partner') return super(ThisEntity, self).create(vals_list)
这种方法最符合Odoo的设计逻辑,既保留了正常业务操作的权限控制,又不影响演示数据的自动加载。
2. 自动给安装用户分配权限组
在模块的data目录下创建XML配置文件,提前给默认管理员(或指定安装用户)分配所需权限组,确保加载演示数据前用户已拥有权限。
步骤:
- 创建
data/assign_groups.xml文件:
<?xml version="1.0" encoding="utf-8"?> <odoo> <!-- 给admin用户分配group_some_role权限组 --> <record id="res_user_admin_assign_some_role" model="res.users"> <field name="id" ref="base.user_admin"/> <field name="groups_id" eval="[(4, ref('some-project.group_some_role'))]"/> </record> </odoo>
- 在模块的
__manifest__.py中,将该XML文件添加到data列表且放在演示数据文件之前:
'data': [ 'data/assign_groups.xml', 'data/demo_data.xml', # 你的演示数据文件 # 其他数据文件 ],
3. 以超级用户身份创建演示数据
在演示数据的XML文件中,通过context="{'sudo': True}"或sudo()方法,让演示数据以超级用户身份创建,绕开权限校验:
方式一:给record添加sudo上下文
<record id="demo_this_entity" model="this.entity" context="{'sudo': True}"> <field name="name">Demo Entity</field> <!-- 其他字段 --> </record>
方式二:用function调用sudo后创建
<function model="this.entity" name="sudo" eval="[]"> <function name="create" eval="[{'name': 'Demo Entity', ...}]"/> </function>
这种方法适合快速临时解决,但如果演示数据需要模拟普通用户的操作场景则不推荐。
内容的提问来源于stack exchange,提问作者user1632812
相关产品推荐
相关产品推荐

