Chapter 3 - Odoo 15 Development Book

Relational Fields

Odoo gives you the ability to link one record to another. In any real business scenario, for implementing and developing our business as per the needs, we have to create relational links between different models. Relational fields in Odoo is used to link a model to another model. Three types of relational fields in Odoo are:

  • Many2one field
  • One2many field
  • Many2many field

Many2one fields:

The Many2one field is used to relate the current object to another object.This object has it as a parent. It connects one of the records of the current model to one of the records of the second model, referred to as the co-model. The _id suffix appears in many2one fields.

    field_id = fields.Many2one(‘comodal_name’, ‘Field Name’)

    comodal_name: which is the name of the related model.

For example, if we want to link our model to the'res.partner' model and call the field 'Contact,' we may create a Many2one field called 'partner id,' which looks like this:

    partner_id = fields.Many2one(‘res.partner’, ‘Contact’)

    we can use:

    partner_id.name

If we need to retrieve a contact's name, which is contained in the comodel as a character field called 'name,'

One2many fields:

The one2many field relation is the inverse of the Many2one relationship.This field can be used to construct relationships between the child model and numerous rows of the parent model. As is customary,

    many2one fields have the _ids suffix.

Syntax for writing One2many field:

    field_ids = fields.One2many(‘comodal_name’, ‘inverse_name’, ‘Field Name’)

    comodal_name: which is the name of a related model.

    inverse_name: which is the name of the inverse Many2one field in comodel.

The values of fields behave like a list. Therefore we can access the data using a loop,


                           for rec in self.field_ids:
print(rec.name)
                           

For example, consider the order_line_ids field defined in the model ‘sale.order’


                           order_line_ids = fields.One2many('sale.order.line', 'order_id', string='Order Lines')
                           

Here, the ‘order_line_ids’ is the One2many field in the comodel ‘sale.order.line’, which has a Many2one field ‘order_id’, that is related to the ‘sale.order’ model. If you want to get the product of the ‘order_line_ids’, which is stored in the field called ‘product_id’ in the comodel, you can use:


                           for rec in order_line_ids:
	print(rec.product_id.name)
                           

Many2many fields:

Many2many fields are used to create multiple bidirectional relationships between two different models. On one side, each record can be linked to any number of records on the other.The _ids suffix is used in many2many fields by convention.

The syntax for writing Many2many field:


                           field_ids = field.Many2many('comodal_name', 'Field Name')
                           

comodal_name: which is the name of a related model. The values of fields behave like a list. Therefore we can access the data using a loop,


                           for rec in self.field_ids:
print(rec.name)
                           

Many2many fields have some optional attributes. Optional attributes are ‘relation’, ‘column_1’, and ‘column_2’.

relation: It stores the relation in the database.

column_1: It is the column referring to our model records in the table ‘relation’.

column_2: It is the column referring to our comodels records in the table ‘relation’.

For example, consider the ‘tag_ids’ field defined in the model ‘sale.order’


                           tag_ids = fields.Many2many('crm.tag', 'sale_order_tag_rel', 'order_id', 'tag_id', string='Tags')
                           

Here the ‘tag_ids’ is the Many2many field in the comodel 'crm.tag’, we can find a relational table called ‘sale_order_tag_rel’ in the database, having two columns ‘order_id’ and ‘tag_id’.

whatsapp
location

Calicut

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

location

London

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

location

Kochi

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

location

Bangalore

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

Send Us A Message