 <p>Django uses a cache. The RDBMS uses a cache. Don't prematurely optimize the queries. </p> <p>You can play with bulk queries in your view function instead of one-at-a-time queries in your template. </p> <pre><code>@render_to('home/main.html') def login(request): # Query all clients clients = Client.objects.all() # Assemble an in-memory table of pets pets = collections.defaultdict(list) for p in Pet.objects.all(): pets[pet.client].append(p) # Create clients and pets tuples clientsPetTuples = [ (c,pets[c]) for c in clients ] return {'clientPets': clientsPetTuples} </code></pre> <p>However, you don't seem to have any evidence that your template is the slowest part of your application.</p> <p>Further, this trades off giant memory use against SQL use. Until you have measurements that prove that your template queries are actually slow, you shouldn't be over thinking the SQL.</p> <p>Don't worry about the SQL until you have evidence.</p>