Many2many and One2many fields in Odoo require a specific syntax for manipulating related data. The instructions mainly consist of 3 elements added in a tuple, where each of the elements has a special meaning.
The first element is an integer number ranging from 0 to 6. each corresponding to a different action. The associated actions for each numerical value are:
- 0: Create
- 1: Update
- 2: Delete
- 3: Unlink
- 4: Link
- 5: Clear
- 6: Set
The second element for Update
, Delete
and Unlink
is the ID
of the record to which the action applies while for the rest of the actions: Create
, Clear
and Set
this element is with value 0
.
The third element for the first two actions (Create
and Update
) is the values
used to create or update the record.
For the next four, this element can be left out. The last action Set
, requires a list of IDs
as a third element. The IDs
represent the related records. This command replaces the existing relations with the newly supplied list of records’ IDs
.
In addition, is the complete tuple for each action:
- Create: (0, 0, values)
- Update: (1, ID, values)
- Delete: (2, ID)
- Unlink: (3, ID)
- Link: (4, ID)
- Clear: (5)
- Set: (6, 0, IDs)
Knowing the logic for the elements in the tuple makes it much easier to understand how to create any action without memorizing the list of tuples. However, from version 15, Odoo made this even easier. Now there is a class helper Command
that is creating the whole tuple.
The commands for each action are listed below:
- Create: Command.create(values)
- Update: Command.update(ID, values)
- Delete: Command.delete(ID)
- Unlink: Command.unlink(ID)
- Link: Command.link(ID)
- Clear: Command.clear()
- Set: Command.set(IDs)
Where values
represent a dictionary of values, ID
is an integer value of the record’s id in the database and IDs
is a list of related records ids in the database.
As an example, we will try to modify the tags related to a sales order. Initially, the sales order has only one tag added to it. That tag is with ID
1
.
Create:
If the requirement is to add another tag to the sales order which is not presented in the database needs to be used the create
command:
this will create a new tag and will add it to the order.
Update:
In case the name of the newly added tag needs to be updated the update will look like this:
Delete:
If the new tag is not needed anymore and needs to be removed from the relation with the sale order but at the same time from the database as well should be used the delete
command.
Unlink:
If the requirement was only to remove the tag from the sales order but still to be available in the database then the command unlink
would be the right one.
Link:
If the tag with ID 3 that already exists in the database needs to be added to the sale order, then link
is the correct command to use.
Clear:
In case the tags are not needed in the order and need to be removed from it, instead of going over the whole list and using unlink
it can be done at once with the clear
command.
Set:
The last case is when the current tags, with ID
1
and 3
, which are already added to the order need to be replaced with tags, with ID
4
and 5
, which are in the database but not related to the order.
The end result after this command will be sales order with tags with IDs
4
and 5
.