Оновлення полів Many2many та One2many (або загальна назва x2many) мають специфічний, але дуже потужний інструмент. Він виглядає так: полю присвоюється список кортежів, в яких прописані команди на оновлення
'order_line': [(0, 0, {
'name': 'Service on demand',
'product_id': self.product_consultant.id,
'product_uom_qty': 24,
'product_uom': self.product_uom_hour.id,
'price_unit': 75.00,
}), (0, 0, {
'name': 'On Site Assistance',
'product_id': self.product_2.id,
'product_uom_qty': 30,
'product_uom': self.product_uom_hour.id,
'price_unit': 38.25,
})],
'value_ids': [(6, 0, [att_size_big.id, att_size_medium.id])]
Важливо! x2many можна оновлювати лише в такий спосіб.
В кортежі перший параметр визначає команда, значення двох інших залежать від команди.
Важливо! Кортежі команд можна комбінувати у списку, вони будуть виконуватись одна за одною.
'value_ids': [(5, 0, 0), (0, 0, {'name': 'Service on demand',}), ]
Всього є шість команд
CREATE = 0
UPDATE = 1
DELETE = 2
UNLINK = 3
LINK = 4
CLEAR = 5
SET = 6
create
Кортеж виглядає (0, 0, values)
Другий параметр ігнорується, третій являє собою словник значень, як при створенні запису.
update
Кортеж виглядає (1, id, values)
В другому параметрі передається id запису що пов’язаний, третій словник значень, що будуть оновлені. Якщо перший команда створює нові записи, ця оновлює. На практиці я команда майже не використовується.
delete
Кортеж виглядає (2, id, 0)
В другому параметрі передається id запису, що видаляється, третій ігнорується.
Видаляє пов'язаний запис.
Важливо! Запис саме видаляється, якщо у зв’язку Many2many на нього є посилання може виникнути помилка у разі ondelete='restrict'.
unlink
Кортеж виглядає (3, id, 0)
В другому параметрі передається id запису, що від’єднується, третій ігнорується.
Видаляє запис з таблиці зв'язку. Для One2many, де зворотне поле має ondelete='cascade' запис буде видалений.
link
Кортеж виглядає (4, id, 0)
В другому параметрі передається id запису, що приєднується, третій ігнорується.
Створює запис в таблиці зв’язку.
clear
Кортеж виглядає (5, 0, 0)
Другий і третій параметри ігноруються.
Видаляє усі зв’язки. Працює так, якби застосувати unlink до усіх пов’язаних записів.
set
Кортеж виглядає (6, 0, ids)
Другий параметр ігнорується, третій це список (це важливо, саме список) id записів.
Замінює поточний список зв’язків на переданий. Так якби очистити зв’язок і створити нові.
Важливо! Навіть якщо треба передати один id, все одно треба передавати список (список з одного елементу).