Skip to main content
iVentureTeam

pick_from

The Pick From column on Odoo's detailed operations tells a warehouse worker exactly which location, lot and package to take stock from. The pick_from widget is a many2one over stock.quant that fakes its display name when the quant is not set.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 24, 2026Updated August 24, 20265 min read
Technical namepick_from
Field typesmany2one (stock.quant)
Viewslist (detailed operations lines), form
Modulestock
Used in core3 occurrences across 2 modules: detailed operations in stock and batch transfers in stock_picking_batch
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0
No-code setupNo. Applied via the widget attribute in view XML
Alternativespackage_m2o, many2one_barcode, many2one

What the Pick From field does

The pick_from widget sits on the quant_id field of stock move lines in the detailed operations table. A quant is one pile of stock: a product in a location, possibly with a lot and a package. Picking a quant answers the warehouse question of where exactly to take the goods from, and the surrounding view then copies the quant's location, lot and package into the line.

Its trick is the empty state. A move line created by reservation carries location, lot and package fields without a quant reference, so a plain many2one would render blank. pick_from instead builds a display name on the fly from the line's own data, location, then lot or typed lot name, then package, joined with hyphen separators, and shows it as a value with id 0. The column therefore always reads like a pick instruction even when nothing was picked manually.

What this means for your team

For warehouse teams the column is the pick list inside the transfer: FIFO or FEFO reservation fills it automatically, and workers only touch it when overriding, for example taking from a closer bin or an earlier expiring lot. The domain in the core view keeps honest choices only: quants of the same product, under the operation's source location.

The done state behavior is a nice audit touch: once the transfer is done or canceled, the package segment drops its full location path and shows just the package name, keeping history readable without the long internal paths.

Supported options in Odoo 19

The widget adds no options of its own; it wraps the standard many2one descriptor, so the whole many2one option set applies. Core itself uses no_create and no_open on the detailed operations columns.

OptionTypeWhat it does
no_openbooleanInherited from many2one and set by core here: removes the link to the quant form, which warehouse users have no business opening mid pick.
no_createbooleanInherited from many2one and set by core here: quants describe physical reality and are never created from this column.
no_quick_createbooleanInherited from many2one. Redundant once no_create is set, available if you relax creation.
no_create_editbooleanInherited from many2one. Removes the create and edit dialog path only.
search_thresholdintegerInherited from many2one, new in 19.0. Minimum characters before the quant search runs; useful on huge warehouses to avoid loading every quant on focus.(since Odoo 19.0)
placeholder_fieldfield nameInherited from many2one, new in 19.0. Rarely relevant here because the synthetic display name occupies the empty state.(since Odoo 19.0)
can_scan_barcodebooleanInherited and undocumented: read in the many2one extractProps only. Lets mobile users fill the field by scanning.
create_name_fieldfield nameInherited and undocumented: read in the many2one extractProps only. Irrelevant while creation is disabled.
The synthetic fallback name is display only: it does not create or reference a quant, and saving the line with id 0 stores an empty quant_id.

Working examples

<!-- Core usage on detailed operations (stock module, abbreviated) -->
<field name="quant_id" widget="pick_from"
       domain="[('product_id', '=', product_id), ('location_id', 'child_of', parent.location_id)]"
       context="{'show_src_package': 1, 'default_product_id': product_id}"
       options="{'no_create': True, 'no_open': True}"/>

The show_src_package context key is consumed server side by stock.quant.package display name computation, switching which package path the quant search results show. The widget itself only passes context through.

The synthetic name, and the owner that never shows

Reading _quant_display_name() closely pays off. It pushes the location display name, then the lot display name or the free typed lot_name, then the package name, shortened to the last segment after the transfer is done or canceled, and then data.owner. That last part is a bug in waiting: the field on move lines is owner_id, which is exactly what the widget declares in its field dependencies, but the code reads data.owner, which never exists, so the consignment owner silently never appears in the synthetic name. The location_dest_id dependency is likewise fetched and never used. Both dependencies survive on the development branch, so this is not going away in Odoo 20.

Version history: the widget appeared in Odoo 17 as a subclass overriding the many2one value getters with tuple values. Odoo 19 rewrote it as a standalone component composing the new Many2One, added the state dependency and the done state package shortening. The 17 and 18 files are identical.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Props system migration only on the development branch; see below.
Odoo 19.0VerifiedVerified against the shipped source. Component rewrite, state dependency and done state package shortening added.
Odoo 18.0VerifiedIdentical to 17.0: subclass overriding the value getters, no package shortening.
Odoo 17.0VerifiedIntroduced here alongside the quant based detailed operations.
Odoo 16.0Not availableDoes not exist. Move lines edited location, lot and package as separate columns.
Exists since 17.0. Views carried from 17 or 18 keep working on 19; the display name simply gets the smarter package handling.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The changes below are read from the public development branch and are not final until release.

No behavioral changes so far: the file is migrated to the new props system, and the display name builder, the dead owner read included, is untouched. The inherited many2one option set follows whatever the base widget does in 20. We re-verify after the release.

Common problems and fixes

SymptomCause and fix
The consignment owner never shows in the Pick From textThe widget reads data.owner while the field is owner_id; the value is never populated, a source level mismatch present since 17.0. Show the owner_id column separately, or patch _quant_display_name in a custom module to read owner_id.
The column is empty on a new manual lineThe synthetic name needs the line's location or lot or package data; a brand new line has none yet. Pick a quant from the dropdown, or fill the location first and the fallback text appears.
Users create junk quants from the pickerA custom view dropped the no_create option core sets. Restore options="{'no_create': True, 'no_open': True}" on the quant_id field.
Package names look different on done transfersIntended: after done or cancel the widget keeps only the last segment of the package path. No action needed; the full path is visible on the quant itself.

Pick From field vs the alternatives

WidgetBest forKey difference
pick_fromThe Pick From column on detailed operationsMany2one over quants with a synthetic location, lot and package fallback name
package_m2oSource and destination package columnsContext keys switch which package path the display name shows
many2one_barcodeFilling a relation by scanning on mobileForces barcode scanning on; no synthetic fallback display
many2oneAny plain relational columnEmpty means blank; no client side name building

pick_from is purpose built for quants on move lines. For related but different jobs, source package columns or barcode driven picking, the alternatives below are the core answers.

Frequently asked questions

What does the Pick From column actually store?+
A reference to a stock.quant in the line's quant_id field. When reservation filled the line without a quant reference, the text you see is built client side from the line's location, lot and package and nothing is stored in quant_id.
Why can I not create a new entry in the Pick From dropdown?+
Core passes no_create because quants mirror physical stock; they are created by inventory operations, not typed into a dropdown. The domain also limits choices to the product under the source location.
Does picking a different quant move my reservation?+
Choosing a quant updates the line's location, lot and package to match it, and the reservation follows when the transfer is checked. The widget itself only sets quant_id; the move line onchange does the rest.
Is pick_from available in Odoo 16?+
No. It arrived in 17.0 with the quant driven detailed operations redesign. On 16 the same information lives in separate location, lot and package columns.

Warehouse picks not matching what the system reserved?

Reservation methods, removal strategies and the detailed operations UX decide whether pickers trust Odoo or fight it. We tune FIFO and FEFO flows, fix custom transfer views, and extend widgets like this one when your putaway logic needs to surface in the pick list.

Tune your Odoo warehouse flows

How this page was produced

The behavior was read from stock_pick_from.js on Odoo 19.0, including the display name builder, the dependency list and the done state package shortening, and cross checked against the detailed operations view XML in the stock module for the domain, context and options core passes. The 17.0 and 18.0 files were diffed to date the rewrite, and the Odoo 20 section reflects a diff against the public development branch. Corrections welcome via our contact page.