Odoo V10中如何在load方法里用数据库ID关联many2one字段
解决Odoo V10中load ORM方法批量创建时关联many2one数据库ID的问题
这个问题我之前也踩过坑!Odoo V10的load方法在处理many2one关联字段时,默认会把传入的值当作名称或外部ID去匹配记录,而不是直接识别纯数字的数据库ID,这就是你直接传id无效的原因。而用名称关联时,每次都会触发name_search查询,数据量一大速度自然就慢得离谱。
正确的处理方式
要直接用数据库ID关联many2one字段,你需要把ID包装成带方括号的字符串格式,比如"[123]"这种形式。这样load方法就会识别这是数据库ID,直接关联对应的记录,不用再做额外的名称查询。
修改后的完整代码
# 从输入数据中提取分类名称列表 parent_categ_codes = [categ['name'] for categ in categ_data] # 通过名称查询已存在的产品分类记录 parent_categ_objs = self.env['product.category'].search([('name','in',parent_categ_codes)]) # 构建名称到记录对象的映射字典 parent_dict = {categ.name: categ for categ in parent_categ_objs} data = [] fields_name = ['name', 'parent_id'] # 组装批量创建的数据 for categ in categ_data: # 将父分类的数据库ID包装成带方括号的字符串 parent_id_str = f"[{parent_dict[categ['parent_id']].id}]" data.append([categ['name'], parent_id_str]) # 调用load方法批量创建 self.env['product.category'].load(fields_name, data)
额外注意事项
- 确保
parent_dict中的父分类记录已经存在于数据库中,不然传入的ID会无效,导致批量创建失败; - 如果你用的是**外部ID(External ID)**而不是数据库ID,直接传外部ID字符串即可,不需要加方括号;
- 这种方式能彻底避免
name_search的额外查询,数据量越大,速度提升越明显。
内容的提问来源于stack exchange,提问作者Ibrar Aslam
相关产品推荐
相关产品推荐

