如何在odoo-10中以编程方式合并res.partner对象?

时间:2019-08-11 06:40:11

标签: merge odoo crm odoo-10

我正在尝试以编程方式在服务器操作中合并一些合作伙伴,而不使用“合并选定的合作伙伴”(这是odoo本身提供的,必须选择一些合作伙伴才能进行一些单击然后合并)。 为此,我使用了base.partner.merge.automatic.wizard模型对象和两个字段集partner_idsdst_partner_id,然后在其上调用了action_merge()方法。 到目前为止,这是我在很多方面都尝试过的方法,但是它不起作用,并且没有错误。

    partner_ids = env['res.partner'].browse([3135,5379])
    dst_partner = env['res.partner'].browse(5379)
    merge = env['base.partner.merge.automatic.wizard'].create({
        'partner_ids': partner_ids,
        'dst_partner_id': dst_partner[0].id,
    })
    merge.action_merge()

(出于测试目的,选择了2个静态ID)

MergePartnerAutomatic(model.TransientModel)在github上的源代码。

1 个答案:

答案 0 :(得分:0)

简短的回答:一个One2many字段使用特殊的语法。因此,请使用'partner_ids': [(6,0,partner_ids.ids)],

partner_ids = env['res.partner'].browse([3135,5379])
dst_partner = env['res.partner'].browse(5379)
merge = env['base.partner.merge.automatic.wizard'].create({
    'partner_ids': [(6,0,partner_ids.ids)],
    'dst_partner_id': dst_partner[0].id,
})
merge.action_merge()

详细答案:

One2many和Many2many使用一种特殊的“命令”格式来操作存储在字段中或与该字段相关联的记录集。

此格式是按顺序执行的三元组的列表,其中每个三元组是要在记录集上执行的命令。并非所有命令都适用于所有情况。可能的命令是:

  • (0,_,值) 添加根据提供的值字典创建的新记录。
  • (1,id,值) 使用值中的值更新现有的id id记录。不能在create()中使用。
  • (2,id,_) 从集中删除id记录的id,然后从数据库中删除它。不能在create()中使用。
  • (3,id,_) 从集合中删除ID为id的记录,但不删除它。不能在One2many上使用。不能在create()中使用。
  • (4,id,_) 将现有ID的ID记录添加到集合中。不能在One2many上使用。
  • (5,_,_) 从集合中删除所有记录,相当于在每个记录上显式使用命令3。不能在One2many上使用。不能在create()中使用。
  • (6,_,ids) 用id列表替换集合中的所有现有记录,等效于对id中的每个id使用命令5后跟命令4。 上面列表中标记为_的值将被忽略,并且可以是任何值,通常为0或False。

参考:https://www.odoo.com/documentation/12.0/reference/orm.html#relational-fields上的Odoo ORM API文档