parent
33dd8f5442
commit
8365d76da0
|
@ -714,9 +714,9 @@ for you transparently.
|
||||||
Caching and QuerySets
|
Caching and QuerySets
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
Each :class:`~django.db.models.query.QuerySet` contains a cache, to minimize
|
Each :class:`~django.db.models.query.QuerySet` contains a cache to minimize
|
||||||
database access. It's important to understand how it works, in order to write
|
database access. Understanding how it works will allow you to write the most
|
||||||
the most efficient code.
|
efficient code.
|
||||||
|
|
||||||
In a newly created :class:`~django.db.models.query.QuerySet`, the cache is
|
In a newly created :class:`~django.db.models.query.QuerySet`, the cache is
|
||||||
empty. The first time a :class:`~django.db.models.query.QuerySet` is evaluated
|
empty. The first time a :class:`~django.db.models.query.QuerySet` is evaluated
|
||||||
|
@ -747,6 +747,43 @@ To avoid this problem, simply save the
|
||||||
>>> print([p.headline for p in queryset]) # Evaluate the query set.
|
>>> print([p.headline for p in queryset]) # Evaluate the query set.
|
||||||
>>> print([p.pub_date for p in queryset]) # Re-use the cache from the evaluation.
|
>>> print([p.pub_date for p in queryset]) # Re-use the cache from the evaluation.
|
||||||
|
|
||||||
|
When querysets are not cached
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Querysets do not always cache their results. When evaluating only *part* of
|
||||||
|
the queryset, the cache is checked, but if it is not populated then the items
|
||||||
|
returned by the subsequent query are not cached. Specifically, this means that
|
||||||
|
:ref:`limiting the queryset <limiting-querysets>` using an array slice or an
|
||||||
|
index will not populate the cache.
|
||||||
|
|
||||||
|
For example, repeatedly getting a certain index in a queryset object will query
|
||||||
|
the database each time::
|
||||||
|
|
||||||
|
>>> queryset = Entry.objects.all()
|
||||||
|
>>> print queryset[5] # Queries the database
|
||||||
|
>>> print queryset[5] # Queries the database again
|
||||||
|
|
||||||
|
However, if the entire queryset has already been evaluated, the cache will be
|
||||||
|
checked instead::
|
||||||
|
|
||||||
|
>>> queryset = Entry.objects.all()
|
||||||
|
>>> [entry for entry in queryset] # Queries the database
|
||||||
|
>>> print queryset[5] # Uses cache
|
||||||
|
>>> print queryset[5] # Uses cache
|
||||||
|
|
||||||
|
Here are some examples of other actions that will result in the entire queryset
|
||||||
|
being evaluated and therefore populate the cache::
|
||||||
|
|
||||||
|
>>> [entry for entry in queryset]
|
||||||
|
>>> bool(queryset)
|
||||||
|
>>> entry in queryset
|
||||||
|
>>> list(queryset)
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Simply printing the queryset will not populate the cache. This is because
|
||||||
|
the call to ``__repr__()`` only returns a slice of the entire queryset.
|
||||||
|
|
||||||
.. _complex-lookups-with-q:
|
.. _complex-lookups-with-q:
|
||||||
|
|
||||||
Complex lookups with Q objects
|
Complex lookups with Q objects
|
||||||
|
|
Loading…
Reference in New Issue