Odoo 14:从其他模型为res.product创建外部标识符问题
Odoo中res.product外部标识符生成不一致的问题解决
你的代码和Odoo导出数据时生成的外部标识符不一致,核心问题在于处理重复命名时的逻辑错误,以下是修正方案:
问题分析
Odoo导出数据生成外部标识符的规则是:
- 基础格式:
{模型数据库表名}_{记录ID},对应__export__模块下的name字段 - 当存在重复时,会在末尾添加递增的后缀,格式变为
{模型数据库表名}_{记录ID}_{后缀数字}
你的代码在处理重复时,错误地将记录ID硬编码为21,导致生成的名称和导出逻辑不符。
修正后的代码
collections = self.env['res.product'].search([('categ', '=', 'nuts')]) if collections: ir_model_data = self.sudo().env['ir.model.data'] for col in collections: postfix = 0 name = f"{col._table}_{col.id}" # 用search_count提升性能,无需加载整条记录 while ir_model_data.search_count([('module', '=', '__export__'), ('name', '=', name)]): postfix += 1 name = f"{col._table}_{col.id}_{postfix}" ir_model_data.create({ 'model': 'res.product', 'res_id': col.id, 'module': '__export__', 'name': name, })
关键修改点
- 移除了重复处理时的硬编码21,改为使用原记录的
col.id,对齐Odoo导出的命名逻辑 - 将
ir_model_data.search替换为search_count,仅判断存在性,提升代码性能 - 使用f-string简化字符串拼接,提高可读性
- 将
ir_model_data的实例化移到循环外,避免重复创建环境对象
内容的提问来源于stack exchange,提问作者user19986231
相关产品推荐
相关产品推荐

