Traversing through Recordset
Traversing through Recordset:
A record set can be simply defined as a set of similar objects or records. It is easier
to access any field value from a single record or a record set of length 1.When it comes
to multiple records it is not possible to access any field value of the record simply by
referring the field name. If that record set has length more than 1, then it will raise
an error when trying to access any field value by dot method ( Eg:
self.partner_ids.name).
As an example consider the model res.partner which holds all the records of Contacts
saved in our Odoo Database. If we wan’t to access the name of a contact record, then
simply we can use partner.nameif partner variable holds a res.partner
record. It is not possible with more than one record in the partner record set.
mapped() method can be used to traverse through a record set of length
more than one. Let’s discuss the method with the help of an example.
Consider 2 models student.parent and student.student
which holds the records of Parents and Students of an educational institution.
from odoo import fields, models
class Student(models.Model):
_name = "student.student"
_description = "Student"
name = fields.Char(string="Name", required=True)
phone = fields.Char(string="Phone Number")
email = fields.Char(string="Email")
partner_id = fields.Many2one('res.partner', string="Partner", required=True)
date = fields.Date(string="Date", default=fields.Date.today())
parent_id = fields.Many2one('student.parent', string="Parent")
from odoo import fields, models
class Parent(models.Model):
_name = "student.parent"
_description = "Parent"
name = fields.Char(string="Name", required=True)
phone = fields.Char(string="Phone Number")
email = fields.Char(string="Email")
partner_id = fields.Many2one('res.partner', string="Partner", required=True)
date = fields.Date(string="Date", default=fields.Date.today())
student_ids = fields.Many2many('student.student', string="Students")
Parent model contains a relational field to store all students related named
student_ids. If the student_ids field have a single student record
then it is possible to get the name of corresponding student by referring
student_ids.name .. But if there are multiple student records in
student_ids field, it is impossible. For getting all the name of
students define a method called get_student_name(). Use
mapped() method to get all names of students in a recordset of
student.student.
def _get_students_name(self, parents):
names = parents.mapped('student_ids.name')
Here the mapped(path) method will traverse the fields of the recordset,
where the path will be a string that contains field name separated by dots.
mapped() method will produce a new recordset that contains all fields
related to that field in the path to all elements in the current recordset.This
recordset is created for each field given in the path.Here in this example, a new
recordset will be created for the fields student_ids and name.
names variable will contain a list of all names of students.This can
also be used to return a recordset. If a relational field is given to the path of
mapped() method rather than any basic type field, it will return a
recordset. In the case of basic field mapped() will be returning a
python list.
One thing to keep in mind is that it may not be efficient to use
mapped() as it operates in memory inside the Odoo server by repeatedly
traversing relations and therefore making SQL queries.search() method
with appropriate domain will make more sense in such cases.