Odoo 19.0 Community · Persistent

stock.lot: fields, relations and API

The stock.lot model ("Lot/Serial") is a persistent model declared by the Inventory module, then extended by 7 other modules. It exposes 64 fields, 34 of them declared directly on the model; 13 fields from other models point to it. Below you will find every field with its technical name, type, label and relations, followed by an Odoo 19 JSON-2 API call.

Model identity

Technical name
stock.lot
Label
Lot/Serial
Type
Persistent (models.Model)
SQL table
stock_lot
Origin module
Inventory (stock)
Extended by
stock_account, sale_stock, mrp, purchase_stock, product_expiry, repair, stock_dropshipping
Default order (_order)
name, id
Inherits from (mixins)
mail.threadmail.activity.mixin

Model fields

34 own fields, 24 inherited from mixins and 6 automatic ORM fields. Click a name to get a direct link to that field.

64 of 64 fields shown

Technical nameLabelTypeDetails
alert_dateAlert Date

Date to determine the expired lots and serial numbers using the filter "Expiration Alerts".

datetime
computed, stored

added by Products Expiration Date (product_expiry)

avg_costAverage Costmonetary
read-onlycomputed

added by WMS Accounting (stock_account)

company_currency_idValuation Currencymany2one
computed

added by WMS Accounting (stock_account)

company_idCompanymany2one
computed, stored
delivery_countDelivery order countinteger
computed
delivery_idsTransfersmany2many
computed
display_completeDisplay Completeboolean
computed
expiration_dateExpiration Date

This is the date on which the goods with this Serial Number may become dangerous and must not be consumed.

datetime
computed, stored

added by Products Expiration Date (product_expiry)

in_repair_countIn repair countinteger
computed

added by Repairs (repair)

location_idLocationmany2one
computed, stored
lot_propertiesPropertiesproperties
lot_valuatedLot Valuatedboolean
read-only

related: product_id.lot_valuated

added by WMS Accounting (stock_account)

nameLot/Serial Number

Unique Lot/Serial Number

char
requiredcomputed, stored
noteDescriptionhtml
partner_idsPartnermany2many
computed
product_expiry_alertProduct Expiry Alert

The Expiration Date has been reached.

boolean
computed

added by Products Expiration Date (product_expiry)

product_expiry_remindedExpiry has been remindedboolean

added by Products Expiration Date (product_expiry)

product_idProductmany2one
required
product_qtyOn Hand Quantityfloat
computed
product_uom_idUnitmany2one

related: product_id.uom_id

purchase_order_countPurchase order countinteger
computed

added by Purchase Stock (purchase_stock)

purchase_order_idsPurchase Ordersmany2many
read-onlycomputed

added by Purchase Stock (purchase_stock)

quant_idsQuantsone2many
read-only

inverse: lot_id

refInternal Reference

Internal reference number in case it differs from the manufacturer's lot/serial number

char
removal_dateRemoval Date

This is the date on which the goods with this Serial Number should be removed from the stock and not be counted in the Fresh On Hand Stock anymore. This date will be used in FEFO removal strategy.

datetime
computed, stored

added by Products Expiration Date (product_expiry)

repair_line_idsRepair Ordersmany2many
computed

added by Repairs (repair)

repair_part_countRepair part countinteger
computed

added by Repairs (repair)

repaired_countRepaired countinteger
computed

added by Repairs (repair)

sale_order_countSale order countinteger
computed

added by Sales and Warehouse Management (sale_stock)

sale_order_idsSales Ordersmany2many
computed

added by Sales and Warehouse Management (sale_stock)

standard_priceCost

Value of the lot (automatically computed in AVCO). Used to value the product when the purchase cost is not known (e.g. inventory adjustment). Used to compute margins on sale orders.

float
company-dependent

added by WMS Accounting (stock_account)

total_valueTotal Valuemonetary
computed

added by WMS Accounting (stock_account)

use_dateBest before Date

This is the date on which the goods with this Serial Number start deteriorating, without being dangerous yet.

datetime
computed, stored

added by Products Expiration Date (product_expiry)

use_expiration_dateUse Expiration Dateboolean

related: product_id.use_expiration_date

added by Products Expiration Date (product_expiry)

activity_calendar_event_idNext Activity Calendar Eventmany2one
computed

inherited from mail.activity.mixin

activity_date_deadlineNext Activity Deadlinedate
read-onlycomputed

inherited from mail.activity.mixin

activity_exception_decorationActivity Exception Decoration

Type of the exception activity on record.

selection
computed

Values: warning (Alert), danger (Error)

inherited from mail.activity.mixin

activity_exception_iconIcon

Icon to indicate an exception activity.

char
computed

inherited from mail.activity.mixin

activity_idsActivitiesone2many

inverse: res_id

inherited from mail.activity.mixin

activity_stateActivity State

Status based on activities Overdue: Due date is already passed Today: Activity date is today Planned: Future activities.

selection
computed

Values: overdue (Overdue), today (Today), planned (Planned)

inherited from mail.activity.mixin

activity_summaryNext Activity Summarychar

related: activity_ids.summary

inherited from mail.activity.mixin

activity_type_iconActivity Type Iconchar

related: activity_ids.icon

inherited from mail.activity.mixin

activity_type_idNext Activity Typemany2one

related: activity_ids.activity_type_id

inherited from mail.activity.mixin

activity_user_idResponsible Usermany2one
read-onlycomputed

inherited from mail.activity.mixin

has_messageHas Messageboolean
computed

inherited from mail.thread

message_attachment_countAttachment Countinteger
computed

inherited from mail.thread

message_follower_idsFollowersone2many

inverse: res_id

inherited from mail.thread

message_has_errorMessage Delivery error

If checked, some messages have a delivery error.

boolean
computed

inherited from mail.thread

message_has_error_counterNumber of errors

Number of messages with delivery error

integer
computed

inherited from mail.thread

message_has_sms_errorSMS Delivery error

If checked, some messages have a delivery error.

boolean
computed

inherited from mail.thread

message_idsMessagesone2many

inverse: res_id

inherited from mail.thread

message_is_followerIs Followerboolean
computed

inherited from mail.thread

message_needactionAction Needed

If checked, new messages require your attention.

boolean
computed

inherited from mail.thread

message_needaction_counterNumber of Actions

Number of messages requiring action

integer
computed

inherited from mail.thread

message_partner_idsFollowers (Partners)many2many
computed

inherited from mail.thread

my_activity_date_deadlineMy Activity Deadlinedate
read-onlycomputed

inherited from mail.activity.mixin

rating_idsRatingsone2many

inverse: res_id

inherited from mail.thread

website_message_idsWebsite Messages

Website communication history

one2many

inverse: res_id

inherited from mail.thread

create_dateCreated ondatetime
read-onlyautomatic
create_uidCreated bymany2one
read-onlyautomatic
display_nameDisplay Namechar
read-onlycomputedautomatic
idIDinteger
read-onlyautomatic
write_dateLast Updated ondatetime
read-onlyautomatic
write_uidLast Updated bymany2one
read-onlyautomatic

Relations

Models linked from this model

Fields of other models pointing here

Reading this model through the API

Odoo 19 JSON-2 API call reading the first five records with real fields of the model. Replace the instance, database and API key with your own.

curl
curl -X POST "https://your-instance.odoo.com/json/2/stock.lot/search_read" \
  -H "Authorization: bearer $ODOO_API_KEY" \
  -H "X-Odoo-Database: your-db" \
  -H "Content-Type: application/json" \
  -d '{"domain":[],"fields":["name","product_id","company_id","location_id","product_uom_id"],"limit":5}'
Python (requests)
import requests

BASE_URL = "https://your-instance.odoo.com/json/2"
headers = {"Authorization": f"bearer {API_KEY}", "X-Odoo-Database": "your-db"}

res = requests.post(
    f"{BASE_URL}/stock.lot/search_read",
    headers=headers,
    json={"domain": [], "fields": ["name","product_id","company_id","location_id","product_uom_id"], "limit": 5},
)
res.raise_for_status()
print(res.json())
  • External API access requires Odoo's Custom plan.
  • XML-RPC and JSON-RPC will be removed in Odoo 22 (fall 2028): use JSON-2.
  • The access rights and record rules of the key's user apply.

Cite this tool

Writing a tutorial, internal documentation or a forum answer? Copy this link to send your readers to the up-to-date reference.

<a href="https://aidoo.ai/en/outils/explorateur-modeles-odoo/stock-lot">stock.lot (Odoo 19.0)</a>

Sources

Data verified on September 23, 2026 · Odoo 19.0 Community

Have an Odoo project, or want to put your ERP to work with AI? Let's talk

Implementation, custom module development, connecting Claude or ChatGPT to your data: tell us about your context and we will reply within 24 business hours.