For a better reading experience, check out this article on my website.

I have recently worked on a ticket ordering system for a conference. It was very important for the customer to see a table of orders including a column with a list of program names in each order:

The models looked (roughly) like this:

class Program(models.Model):name = models.CharField(max_length=20)

class Price(models.Model):program = models.ForeignKey(Program)from_date = models.DateTimeField()to_date = models.DateTimeField()

class Order(models.Model):state = models.CharField(max_length=20)items = models.ManyToManyField(Price)

Before we start

Throughout this article we are going to monitor the queries executed by Django. To log the queries add the following to the LOGGING settings in settings.py:

LOGGING = {

...     
  
'loggers': {  
    **'django.db.backends': {  
        'level': 'DEBUG',  
    },**  
},  

}

Let’s see you trying to find an image related to prefetching…