For a better reading experience, check out [this article on my website.](https://hakibenita.com/all-you-need-to-know-about-prefetching-in-django) 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) * **Program** is a session, lecture or a conference day. * Prices can change over time so we used a model called **Price**, modeled as a [type 2 slowly changing dimension](https://en.wikipedia.org/wiki/Slowly_changing_dimension#Type_2:_add_new_row) (SCD) that represents the price of a program at a certain time. * User’s can register to one or more programs. Each item in an **Order** is a program price at the time the order was made. ### 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…