Odoo 16 Development Book

Extending create() and write()

Extending create() method

To include any additional functionality while creating a record of the model, we can extend a model's create() function.

Let's use adding a "notes" field to the "sale.order" as an example.

In this case, editing the notes field will result in a "UserError" for users who are not members of the "Administration/Access Rights" group.

class SaleOrder(models.Model):
   _inherit = 'sale.order'
   notes = fields.Text(string='Notes')
   def create(self,vals):
       res = super(SaleOrder,self).create(vals)
       if 'notes' in vals and not self.env.user.has_group('base.group_erp_manager'):
           raise UserError(_("You cannot edit the field 'notes'"))
       return res

As an example of the write() method, we can do the same thing. Before writing, we evaluate the group and occurrence of the field in the vals to write, and if there is a problem, we raise a UserError exception.

def write(self,vals):
   res = super(SaleOrder,self).write(vals)
   if 'notes' in vals and not self.env.user.has_group('base.group_erp_manager'):
       raise UserError(_("You cannot edit the field 'notes'"))
   return res

Overriding _name_search()

By redefining name search, we can search for a record in the Many2one widget using any field in the model.

Let’s take an example: In the Many2one field, we can search for a partner by name, phone number, or email.

class ResPartner(models.Model):
   _inherit = 'res.partner'
   def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
       args = args or []
       domain = []
       if name:
           domain = ['|', '|', ('name', operator, name), ('phone', operator, name), ('email', operator, name)]
       return self._search(domain + args, limit=limit, access_rights_uid=name_get_uid)

To begin, we must inherit the res.partner class and override the _name search() function.

Most of the arguments we receive are passed on in their original form to the method's super() implementation:

  • name is a string containing the value that the user has typed thus far, the user input.
  • As a prefilter for the potential records, args can either be None or a search domain. (It could be derived from the domain parameter of the Many2one relation, for instance.)
  • operator is a string that contains the match operator. Generally, you will have 'ilike' or '='.Customizing how records are searched
  • The maximum number of rows to retrieve is specified by limit.
  • name_get_uid can be used to specify a different user when calling name_get() to compute the strings to display in the widget.


Cybrosys Technologies Pvt. Ltd.
Neospace, Kinfra Techno Park
Kakkancherry, Calicut
Kerala, India - 673635



Cybrosys Limited
Alpha House,
100 Borough High Street, London,
SE1 1LB, United Kingdom



Cybrosys Technologies Pvt. Ltd.
1st Floor, Thapasya Building,
Infopark, Kakkanad,
Kochi, India - 682030.



Cybrosys Techno Solutions
The Estate, 8th Floor,
Dickenson Road,
Bangalore, India - 560042

Send Us A Message