 <p>The <code>queryset</code> example you have given rightly indicates that <code>querysets</code> are evaluated lazily i.e the first time they are used. So when subsequently used again, they are not evaluated in the same flow when assigned to a variable. This is not exactly caching but re-using an evaluated expression as long as it is available in an optimized manner.</p> <p>For the kind of caching you are looking at i.e the same view called twice, you will need to manually cache the database object when it is fetched the first time. <a href="https://docs.djangoproject.com/en/dev/topics/cache/?from=olddocs#memcached" rel="nofollow">Memcached</a> is good for this. Then subsequently check and fetch like in example below.</p> <pre><code>def view(request): results = cache.get(request.user.id) if not results: results = do_a_ton_of_work() cache.set(request.user.id, results) </code></pre> <p>There are of course a lot of other ways to do caching at different levels right from your proxy server to per url caching. Whatever works best for you. <a href="http://www.jeffknupp.com/blog/2012/02/24/django-memcached-optimizing-django-through-caching/" rel="nofollow">Here</a> is a good read on this topic.</p>