Як змінювати значеняя в полях x2many (Many2many та One2many)

Оновлення полів 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, все одно треба передавати список (список з одного елементу).

Як змінювати значеняя в полях x2many (Many2many та One2many)
Володимир Карабанов 23 квітня 2022 р.
Поділитися цією публікацією
Теги
Архів
Логування в Odoo