stock_move_one2many
The operations list on a transfer. Its distinguishing feature is a button that adds every line in a package at once, and it saves the whole picking before it can even offer that.
| Technical name | stock_move_one2many |
|---|---|
| Field types | one2many, many2many |
| Views | form, with an embedded list |
| Module | stock, the Inventory app |
| Used in core | 1 occurrence, the operations tab of the transfer form in stock |
| Versions | Odoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0 |
| No-code setup | No. It depends on picking-specific server methods and context keys |
| Alternatives | sml_x2_many, one2many, package_m2m, move_product_label_field |
What the picking operations list does
What this means for your team
Supported options in Odoo 19
| Option | Type | What it does |
|---|---|---|
picking_state | context key | Read from the embedded list's context. The package action is hidden when the transfer is done or canceled.(since Odoo 19.0) |
picking_type_code | context key | Read from the embedded list's context. The package action is hidden on incoming transfers.(since Odoo 19.0) |
editable | string (list attribute) | Set on the embedded list. Governs inline editing of the operations themselves. |
The gating is read from context, not from options. The widget checks the transfer's state and its operation type code from the list's context, plus the package tracking group on the user. A custom view that does not pass those context keys will show the action in situations where core would hide it.
Working examples
Why the picking saves before the dialog opens
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | Partial / changed | Not released. One template constant renamed; behavior unchanged. |
| Odoo 19.0 | Verified | Verified against the shipped source. Rewritten, with the package action introduced. |
| Odoo 18.0 | Partial / changed | Same widget name, different implementation: an auto-sizing renderer with an injected details column, and no package action. |
| Odoo 17.0 | Partial / changed | Same as Odoo 18 in shape. |
| Odoo 16.0 | Partial / changed | Earliest version of the widget, again without the package action. |
Upgrade note. The widget name is stable back to Odoo 16, but the implementation was rewritten in Odoo 19: a different base renderer, the removal of an injected details column, and the arrival of the package action. Any JavaScript customization of this renderer written for Odoo 18 or earlier will not apply. View XML is unaffected.
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| The add package action is missing | Package tracking is off, the transfer is done or canceled, or it is an incoming transfer. Enable package tracking, and check the transfer's state and operation type. |
| The transfer saved itself when I clicked the action | Intended. The picking must exist and its location must be current before packages can be filtered. Expected. Assemble the transfer knowing that the action commits it. |
| No packages are offered | There are no packages under the transfer's source location. Check the source location, and that the packages are stored beneath it. |
| The whole page reloads after adding | Intended. The lines are created server side and can change availability across the transfer. Nothing to fix; a local insert would show stale quantities. |
| The action appears when it should not | A custom subview does not pass the state or operation type context keys. Supply both keys in the field's context, as the core view does. |
| A renderer customization stopped working on Odoo 19 | The widget was rewritten onto a different base renderer. Redo the customization against the current implementation. |
Picking operations list vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
stock_move_one2many | Transfer operations, especially where whole packages move as a unit | Adds a package selection that saves the picking first and lets the server create the lines |
sml_x2_many | The detailed operations under a move | Picks from real quants rather than adding package contents |
| one2many | An ordinary child list | No package action and no picking context awareness |
| package_m2m | Showing which packages a move touches | A read-only cell inside this list, not the list itself |
| move_product_label_field | The product cell inside this list | A cell widget handling the product and its description |
Frequently asked questions
Why does the transfer save when I add packages?+
Why is the add package action missing?+
Why does the page reload after adding a package?+
Does it support any options?+
Is it the same widget as in Odoo 18?+
Warehouse screens that match how your team moves stock
Packages, lots and multi-step routes each change what a transfer screen should show. We configure and extend Odoo Inventory around your actual operations, on versions 16 through 19.
Book a free consultation