odoo - 如何一次从多个组中删除用户 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
提前致谢
解决方案
实际上你想删除一些组并添加一些其他组,首先当你使用时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。
推荐阅读
- pyqt - 在主窗口菜单栏中设置父嵌入小部件
- algorithm - O(n) 最坏情况的基数排序算法
- javascript - 如何确定与 JavaScript 中的 for 循环相关的具有十进制值的空间点?
- c# - Razor 视图引擎:如何告诉智能感知在哪里寻找包程序集
- python - 有什么方法可以减少不同类中的代码重复
- android - 如何获取 Push.Key Firebase for Android Kotlin 中的数据
- python - 你需要什么拉链?
- javascript - 如何将多个scss文件捆绑到一个文件中
- elasticsearch - Kibana 通过索引限制访问
- python - 聚类数百万个大型二元向量?