Using select_related for Optimization
A snippet showing how to use select_related for efficient querying of related objects.
# models.py
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
def __str__(self):
return self.title
# views.py
from django.shortcuts import render
from .models import Book
def book_list_without_select_related(request):
books = Book.objects.all() # This will cause N+1 queries when accessing book.author
book_info = [(book.title, book.author.name) for book in books]
return render(request, 'books.html', {'books': book_info})
# Each book.author access triggers a separate query
def book_list_with_select_related(request):
books = Book.objects.select_related('author') # This does a JOIN, only 1 query
book_info = [(book.title, book.author.name) for book in books]
return render(request, 'books.html', {'books': book_info})
# book.author is already fetched; no extra queries per book
Explanation:
-
select_related()fetches related objects in a single SQL query using a JOIN. - It prevents the “N+1 query” problem by reducing the number of database hits when looping over objects.
- Best for one-to-one and many-to-one relationships (like ForeignKey).
- Use when you know you'll need the related object immediately for each query result.
- Category Models & ORM
- Total Views 492
- Last Modified 27 November, 2025
- Tags #queryset #optimization #select_related #orm
Previous snippet
Using QuerySet aggregate()
Next snippet