Author: Yousef M. Y. Al Sabbah
Version: 18.0.1.0.0
Category: Technical
In real Odoo projects, many models need:
- A human-readable reference (e.g.,
SO001,PO001,REQ001) - Auto-generated sequence numbers
- A consistent display name format
Without a mixin, developers copy the same logic repeatedly:
# This code is repeated in EVERY model that needs a reference!
reference = fields.Char(required=True, copy=False, default='New')
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if vals.get('reference', 'New') == 'New':
vals['reference'] = self.env['ir.sequence'].next_by_code('my.sequence')
return super().create(vals_list)
def name_get(self):
return [(r.id, f"[{r.reference}] {r.name}") for r in self]This is copied across:
- Sales Orders
- Purchase Orders
- Requests, Tickets, Assets
- Custom workflows
"This model has a reference code and knows how to display itself."
This is a CAPABILITY, not a business concept → Perfect for a Mixin!
from odoo import fields, models
class MyRequest(models.Model):
_name = 'my.request'
_description = 'My Request'
_inherit = ['reference.mixin'] # <-- Just add this!
# Set your sequence code
_reference_sequence = 'my.request.sequence'
# Your fields (reference is inherited!)
name = fields.Char(string='Name')<record id="sequence_my_request" model="ir.sequence">
<field name="name">My Request Sequence</field>
<field name="code">my.request.sequence</field>
<field name="prefix">REQ</field>
<field name="padding">5</field>
</record>Your model now has:
- ✅
referencefield (auto-generated) - ✅
display_namecomputed as[REF00001] Name - ✅ Sequence generation on create
| Feature | Description |
|---|---|
reference field |
Auto-generated, readonly, indexed |
display_name |
Computed from reference + name |
create() override |
Generates sequence automatically |
| Company support | Works with multi-company |
Override these in your model:
class MyModel(models.Model):
_name = 'my.model'
_inherit = ['reference.mixin']
# Required: Your sequence code
_reference_sequence = 'my.model.sequence'
# Optional: Change field name (default: 'reference')
_reference_field = 'reference'
# Optional: Change default value (default: 'New')
_reference_default = 'New'This mixin follows the same pattern used in Odoo core:
| Module | Model | Sequence |
|---|---|---|
| Sale | sale.order |
SO00001 |
| Purchase | purchase.requisition |
PR00001 |
| Stock | stock.picking.batch |
BATCH/00001 |
This module includes a demo.request model that demonstrates the mixin in action.
After installation:
- Go to Reference Mixin Demo menu
- Create a new Demo Request
- Notice the reference is auto-generated (REQ00001, REQ00002, etc.)
odt_reference_mixin/
├── __init__.py
├── __manifest__.py
├── README.md
├── data/
│ └── sequence_data.xml # Demo sequence
├── models/
│ ├── __init__.py
│ ├── reference_mixin.py # THE MIXIN
│ └── demo_request.py # Demo model
├── security/
│ └── ir.model.access.csv
└── views/
├── demo_request_views.xml
└── menu_views.xml
LGPL-3
Author: Yousef M. Y. Al Sabbah