Odoo ORM Cheatsheet
The Odoo ORM cheat sheet provides you with the most commonly used Odoo ORM methods and queries for your reference.
Basic CRUD
python
# Create a record
self.env['model.name'].create({'field': value})
python
# Read records
records = self.env['model.name'].search([('field', '=', value)])
python
# Update records
record.write({'field': new_value})
python
# Delete records
record.unlink()
Advanced Usage
Search Domain
python
records = self.env['model.name'].search([
('field1', '=', value1),
'|', ('field2', '!=', value2), ('field3', 'in', [1,2,3])
])
More ORM Methods
Create Records
python
# Create a single record
self.env['model.name'].create({
'field1': value1,
'field2': value2,
})
# Create multiple records
self.env['model.name'].create([
{'field1': value1, 'field2': value2},
{'field1': value3, 'field2': value4},
])
Read Records
python
# Search records
records = self.env['model.name'].search([('field', '=', value)])
# Browse by ID
record = self.env['model.name'].browse(id)
# Read specific fields
values = record.read(['field1', 'field2'])
# Get field value
value = record.field_name
Update Records
python
# Update single record
record.write({
'field1': new_value1,
'field2': new_value2,
})
# Update multiple records
records.write({
'field1': new_value1,
'field2': new_value2,
})
Delete Records
python
# Delete single record
record.unlink()
# Delete multiple records
records.unlink()
Search Methods
Search Domain
python
# Basic search
records = self.env['model.name'].search([
('field1', '=', value1),
('field2', '!=', value2),
])
# Complex conditions
records = self.env['model.name'].search([
'|', # OR
'&', # AND
('field1', '=', value1),
('field2', '!=', value2),
('field3', 'in', [value3, value4]),
])
Search Operators
python
# Common operators
'=' # equals
'!=' # not equals
'>' # greater than
'>=' # greater than or equal
'<' # less than
'<=' # less than or equal
'like' # pattern matching
'ilike' # case-insensitive pattern matching
'in' # in list
'not in'# not in list
Recordset Operations
Filtering
python
# Filter records
filtered_records = records.filtered(lambda r: r.field > value)
# Filter by domain
filtered_records = records.filtered_domain([('field', '=', value)])
# Map to field values
values = records.mapped('field_name')
Sorting
python
# Sort by field
sorted_records = records.sorted('field_name')
sorted_records = records.sorted(key=lambda r: r.field_name)
# Reverse sort
reversed_records = records.sorted('field_name', reverse=True)
Environment Methods
Context
python
# Get context
context = self.env.context
# Update context
self.with_context(key=value)
self.with_context(dict(key=value))
# Switch company
self.with_company(company_id)
User
python
# Get current user
user = self.env.user
# Get user companies
companies = self.env.user.company_ids
# Check access rights
self.env.user.has_group('group_name')
Common Patterns
Name Search
python
def name_search(self, name='', args=None, operator='ilike', limit=100):
args = args or []
domain = []
if name:
domain = ['|', ('name', operator, name), ('code', operator, name)]
return self.search(domain + args, limit=limit).name_get()
Name Get
python
def name_get(self):
result = []
for record in self:
name = f"{record.code} - {record.name}"
result.append((record.id, name))
return result
Default Get
python
def default_get(self, fields_list):
defaults = super().default_get(fields_list)
defaults['field'] = self.env.context.get('default_field', False)
return defaults