Skip to content

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

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