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 493
  • Last Modified 27 November, 2025
  • Tags #queryset #optimization #select_related #orm
Never miss a story on Django.wiki

Subscribe for fresh tutorials, snippets, and updates.

By subscribing you agree to our Privacy Policy.