Decorators and Its Utility in Odoo?

Decorators and Its Utility in Odoo?

A decorator is a function that takes a function as input, and returns a function.

The anatomy of the decorator is: @decorator-expression


Decorator-expression is an expression that returns a callable thing. The callable thing has to take single argument. Function-definition is a function definition (it therefore must begin with def).

In older version of odoo we use cursor, uid, context and ids for defining all method.

In odoo 9, odoo 10 we use self as the parameter when defining a method with certain method decorators.This decorators are passed the parameters explicitly to the method. Which provide a smooth way to write functions and avoid complications.

Decorators in odoo:

  2. @api.multi
  3. @api.model
  4. @api.depends
  5. @api.onchange
  6. @api.constrains

It is specific for one record and cannot be used for multiple records. Self is redefined as current record.

def get_product(self):

self.product_name = ‘desktop’

This function will automatically writes product name field of each records with ‘desktop’.


                        It can used for multiple record, so we can loop through it. Here Self contains recordset, so that we need for loop for iterating through each record.


def get_product(self):

For record in self:

self.product_name = ‘desktop’


                        This decorator will convert old API calls to decorated function to new API signature.



This decorator is specifically used for compute fields in odoo. The decorator function works only if any of the fields specified in the @api.depends is changed in the form.

Dependencies can be dotted paths when using sub-fields.



def _get_street(self):

for record in self:

for line in record.partner_id:

record.street = line.street

Computed field are not stored by default, they are computed the function and return the value.We use store = True to store the computed value to database.

  1. @api.onchange:

This decorator will avoid the on change attribute in xml file. The fields are written as the parameter of the function.



def onchange_age_calculation(self ):

if not self.date_of_birth:

self.age = 0


today_date =

date_split = self.date_of_birth.split(‘-‘,1)

birth_year = date_split[0]

self.age = today_date -int(birth_year)


This function will automatically writes age field when changing the value of date_of_birth field in form view.


This decorator will ensure that decorated function will be called on create, write, unlink operation. It will act as a constraint checker. This will especially use for warning messages and validation.

For Customized ERP Solutions at best prices Contact Us now