django select_related multiple

  1. Start with the Django model where you want to use select_related. Import the necessary modules and define your model.
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    country = models.CharField(max_length=50)

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    publication_date = models.DateField()
  1. In your view or queryset, use the select_related method to perform a single SQL query that retrieves related objects.
book_queryset = Book.objects.select_related('author')
  1. Access the related object attributes without triggering additional database queries.
for book in book_queryset:
    print(book.title)
    print(book.author.name)
    print(book.author.country)
  1. If you have multiple foreign key relationships, you can chain select_related to fetch related objects at multiple levels.
book_queryset = Book.objects.select_related('author__publisher')
  1. Access the attributes of the deeply related objects in a similar manner.
for book in book_queryset:
    print(book.title)
    print(book.author.name)
    print(book.author.country)
    print(book.author.publisher.name)
    print(book.author.publisher.location)
  1. Ensure that the foreign key relationships are properly defined in your models for select_related to work efficiently.
class Publisher(models.Model):
    name = models.CharField(max_length=100)
    location = models.CharField(max_length=50)

class Author(models.Model):
    name = models.CharField(max_length=100)
    country = models.CharField(max_length=50)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
  1. Update your select_related call to include the new foreign key relationship.
book_queryset = Book.objects.select_related('author__publisher')
  1. Access the attributes of the newly added related object.
for book in book_queryset:
    print(book.title)
    print(book.author.name)
    print(book.author.country)
    print(book.author.publisher.name)
    print(book.author.publisher.location)