working with select_related in django


working with select_related in django

select_related is a queryset method in Django which returns new queryset result for a Django Model. select_related is more helpful in foreign-key relationships. It is useful when we are going to use those foreign-key relationship data later in our code.  select_related is a preformance booster, which caches the result for the foreign-key relationships, so that django ORM do not need to query again to get the data for the foreign-key relationships.

How select_related works?

select_related creates a single complex query using joins on related models and retrives the data at once and caches it for later use, So foreign-key relationships won't require database queries.

Example Use Case:

lets consider below models

class ClassRoom(models.Model):
	name = models.CharField(max_length=100)

	def __str__(self):
		return self.name

class Student(models.Model):
	name = models.CharField(max_length=100)
	class_room = models.ForeignKey(ClassRoom, on_delete=models.CASCADE)

	def __str__(self):
		return self.name

let's consider below queries

query1 = Student.objects.all()
for student in query1:
    print(student.name)
    print(student.class_room.name)  # queries the database for relational data
query2 = Student.objects.all().select_related()
for student in query2:
  print(student.name)
  print(student.class_room.name) # no database query

In above code when we use the query1 it generates the SQL code like below

SELECT "myapp_student"."id", "myapp_student"."name", "myapp_student"."class_room_id" FROM "myapp_student"

In above code when we use the query2 it generates the complex SQL code like below

SELECT "myapp_student"."id", "myapp_student"."name", "myapp_student"."class_room_id", "myapp_classroom"."id", "myapp_classroom"."name" FROM "myapp_student" INNER JOIN "myapp_classroom" ON ("myapp_student"."class_room_id" = "myapp_classroom"."id")

in the query2 django is joining the foreign key relationships so, when foreign key data is required then django ORM will not hit the database. query1 results in 1 + number of records queries to the database where as in query2 it results in only 1 database  query. So, It's recommended to use the select_related when we use foreign key related data.

 

Read Next: object oriented programming in python

Read Prev: using custom widgets in django

Blog Archive