如何将Python元组列表导入Odoo数据库?
用Python批量导入数据到Odoo自定义模型
直接通过Odoo的Python API处理是最稳妥的方案,能避开CSV导入时的约束冲突问题,具体步骤如下:
1. 建立Odoo环境连接
根据你的脚本运行场景选择连接方式:
- 外部脚本(远程连接):用Odoo官方RPC库
import xmlrpc.client url = 'http://你的Odoo实例地址' db = '你的数据库名' username = '登录账号' password = '登录密码' # 验证身份 common = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/common') uid = common.authenticate(db, username, password, {}) # 获取模型操作接口 models = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/object')
- Odoo模块内脚本(本地运行):直接使用内置环境
# 在自定义模块的方法中调用 model = self.env['你的自定义模型名']
2. 转换元组为Odoo字段字典
假设你的元组顺序对应模型字段field1、field2、field3,把元组列表转成Odoo可识别的字典列表:
# 示例元组列表 tuple_list = [('值1', '值2', '值3'), ('值4', '值5', '值6')] # 转为字典列表 record_dicts = [ {'field1': t[0], 'field2': t[1], 'field3': t[2]} for t in tuple_list ]
3. 批量创建记录
调用Odoo的create方法批量插入,若涉及外键约束,需确保关联记录已存在:
- RPC方式:
# 批量创建记录 models.execute_kw(db, uid, password, '你的自定义模型名', 'create', [record_dicts])
- 模块内方式:
model.create(record_dicts)
4. 处理约束冲突
如果遇到唯一字段重复等约束问题,可提前校验并选择更新或跳过:
# 示例:检查field1是否重复,存在则更新,不存在则创建 for t in tuple_list: existing_record = model.search([('field1', '=', t[0])], limit=1) if existing_record: existing_record.write({'field2': t[1], 'field3': t[2]}) else: model.create({'field1': t[0], 'field2': t[1], 'field3': t[2]})
为什么不推荐CSV导入?
CSV导入时Odoo会强制校验所有约束,且难以处理复杂关联数据或自定义逻辑;Python API则能灵活控制导入流程,提前处理冲突,还可加入日志方便排查问题。
内容的提问来源于stack exchange,提问作者Dartage
相关产品推荐
相关产品推荐

