首页 > 解决方案 > 如何一次从多个组中删除用户 Odoo 12

问题描述

在联系表单的写入方法从“个人”更改为“公司”时,我想一次从多个组中删除用户。

@api.multi
def write(self, values):
    user = self.env['res.users'].search([('partner_id', '=', self.id)])
    if 'company_type' in values:
        if values["company_type"] == "company":
            # want to add in below group
            """[(6, 0, [self.env.ref('base.group_user').id,
                                           self.env.ref('sales_team.group_sale_salesman_all_leads').id,
                                           self.env.ref('survey.group_survey_manager').id
                                           ])]"""

            # want to remove from below group
            """[(6, 0, [self.env.ref('base.group_portal').id,
                                           self.env.ref('survey.group_survey_user').id,
                                           ])]"""
    res = super(Contact, self).write(values)
    return res

提前致谢

标签: odooodoo-12

解决方案


实际上你想删除一些组并添加一些其他组,首先当你使用时api.multi总是期望 self 包含多个记录,所以当你这样做时,self.id你可能会拥有着名的singleton Error.

其次,不要仅在您打算对他们做某事时才开始搜索用户,因此将搜索移到if statement.

@api.multi
def write(self, values):
    if values.get('company_type', False) ==  "company":
        users = self.env['res.users'].search([('partner_id', 'in', self.ids)])
        # remove some groups: [(3, id_of_group), ....etc]
        to_remove = [(3, self.env.ref(group_xml_id).id) for group_xml_id in ['base.group_portal', 'survey.group_survey_user']]
        # add some groups [(4, id_of_group), ... ect]
        to_add =  [(4, self.env.ref(group_xml_id).id) for group_xml_id in ['base.group_user', 
                                                                           'sales_team.group_sale_salesman_all_leads',
                                                                           'survey.group_survey_manager']]
        # contatenate the list to call write only one time
        users.write({'groups_id': to_remove + to_add})

    return super(Contact, self).write(values)

当您想从 many2many 字段使用中删除command (3, id_of_record)记录时,以及当您想添加记录时(4, id_of_record)

Odoo ORM API 文档:

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

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

(0, _, values):添加从提供的值字典创建的新记录。

(1, id, values):使用 values 中的值更新 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): 将集合中的所有现有记录替换为 ids 列表,相当于对 ids 中的每个 id 使用命令 5 后跟命令 4。


推荐阅读