На самом деле вы хотите удалить некоторые группы и добавить некоторые другие группы, во-первых, когда вы используете 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)
:
Документация по API Odoo ORM:
One2many и Many2many используют специальный формат «команд» для управления набором записей, хранящихся в / связанных с полем.
Этот формат представляет собой список триплетов, выполняемых последовательно, где каждый триплеткоманда для выполнения на множестве записейНе все команды применяются во всех ситуациях. Возможные команды:
(0, _, values):
добавляет новую запись, созданную из предоставленного значения dict.
(1, id, 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):
заменяет все существующие записи в наборе на список идентификаторов, что эквивалентно использованию команды 5, за которой следует команда 4 для каждого идентификатора в идентификаторах.