Импорт one2many, many2many и many2one в Odoo 12/13

Импорт *2many в Odoo имеет свои особенности. В системе предусмотрены флаги, которые позволяют проводить манипуляции с one2many, many2many. Пример:

  • (0, 0, { values }) — ссылка на новую запись, которую необходимо создать с данным словарем значений
  • (1, ID, { values }) — обновить связанную запись, записав в нее значение id = ID
  • (2, ID) — убрать связь и удалить связанную запись с id = ID (вызывает unlink для ID, который полностью удалит объект, а также ссылку на него)
  • (3, ID) — вырезать ссылку на связанную запись с id = ID (удалить связь между двумя объектами, но не удалить сам целевой объект)
  • (4, ID) — ссылка на существующую запись с id = ID (добавляет связь)
  • (5) — отменить связь всех (например, используя (3, ID) для всех связанных записей)
  • (6, 0, [IDs]) — заменить список связанных идентификаторов. Является комбинацией 2х методов, например, используя (5) затем (4, ID) для каждого идентификатора в списке идентификаторов.

Начнем с самого сложного.

one2many и many2many

my_tag_id = 42  # значение тега, которое присвоим партнеру
my_partner_id = 25 # идентификатор партнера
id = models.execute_kw(db, uid, password, 'res.partner', 'write',
    [my_partner_id], [{
    'category_id': [[4, my_tag_id]],
}])

В этом примере мы привязали тег с идентификатором 42 партнеру с id = 25. Если тег не существует, мы можем использовать следующий флаг:

my_partner_id = 25 # идентификатор партнера
new_tag_name = 'Сотрудник месяца' # Название нового тега
id = models.execute_kw(db, uid, password, 'res.partner', 'write',
    [my_partner_id], [{
    'category_id': [[0, 0, ['name': new_tag_name]]],
}])

Если нужно удалить все связи, но не удалять значения из системы, можно использовать следующий код:

my_tag_id = 42  # значение тега, которое присвоим партнеру
id = models.execute_kw(db, uid, password, 'res.partner', 'write',
    [my_partner_id], [{
    'category_id': [(5,)],
}])

many2one

C many2one все гараздо проще. Чтобы именить значение, достаточно просто указать идентификатор объекта:

id = models.execute_kw(db, uid, password, 'sale.order', 'write', [[100], { 'partner_id': 25,}])

Этим действием мы сменили покупателя для заказа с идентификатором 100. Теперь заказ оформлен на пользователя с идентификатором 25.

При работе с модулем Odoo

На всякий случай, оставлю это сдесь:

# Создание объекта в res.partner со связью Many2Many
customer_tags = [15, 17]
created = self.create({ 'name': name, 'category_id': [[6, 0, customer_tags]],})


# Odoo