summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Plant <L.Plant.98@cantab.net>2012-02-28 19:34:04 +0000
committerLuke Plant <L.Plant.98@cantab.net>2012-02-28 19:34:04 +0000
commitde9942a6673cfbe442abdfabc1e8f7c0a652ef5b (patch)
tree4672c363db7cbb1b81ea533be2b00b0ce25129f0
parent4b641b78fa1e9cf774d1c0339ef07a854c35e011 (diff)
Fixed #17668 - prefetch_related does not work in in_bulk
Thanks to gurets for the report, and akaariai for the initial patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17600 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/db/models/query.py2
-rw-r--r--docs/ref/models/querysets.txt6
-rw-r--r--tests/modeltests/prefetch_related/tests.py13
3 files changed, 20 insertions, 1 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 41c24c7a58..08fda78332 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -485,7 +485,7 @@ class QuerySet(object):
qs = self._clone()
qs.query.add_filter(('pk__in', id_list))
qs.query.clear_ordering(force_empty=True)
- return dict([(obj._get_pk_val(), obj) for obj in qs.iterator()])
+ return dict([(obj._get_pk_val(), obj) for obj in qs])
def delete(self):
"""
diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt
index 4d6b9bc533..13504f41cf 100644
--- a/docs/ref/models/querysets.txt
+++ b/docs/ref/models/querysets.txt
@@ -871,6 +871,9 @@ could be generated, which, depending on the database, might have performance
problems of its own when it comes to parsing or executing the SQL query. Always
profile for your use case!
+Note that if you use ``iterator()`` to run the query, ``prefetch_related()``
+calls will be ignored since these two optimizations do not make sense together.
+
extra
~~~~~
@@ -1430,6 +1433,9 @@ performance and a significant reduction in memory.
Note that using ``iterator()`` on a ``QuerySet`` which has already been
evaluated will force it to evaluate again, repeating the query.
+Also, use of ``iterator()`` causes previous ``prefetch_related()`` calls to be
+ignored since these two optimizations do not make sense together.
+
latest
~~~~~~
diff --git a/tests/modeltests/prefetch_related/tests.py b/tests/modeltests/prefetch_related/tests.py
index 4c51a83bd9..382aed68b4 100644
--- a/tests/modeltests/prefetch_related/tests.py
+++ b/tests/modeltests/prefetch_related/tests.py
@@ -470,3 +470,16 @@ class NullableTest(TestCase):
for e in qs2]
self.assertEqual(co_serfs, co_serfs2)
+
+ def test_in_bulk(self):
+ """
+ In-bulk does correctly prefetch objects by not using .iterator()
+ directly.
+ """
+ boss1 = Employee.objects.create(name="Peter")
+ boss2 = Employee.objects.create(name="Jack")
+ with self.assertNumQueries(2):
+ # Check that prefetch is done and it does not cause any errors.
+ bulk = Employee.objects.prefetch_related('serfs').in_bulk([boss1.pk, boss2.pk])
+ for b in bulk.values():
+ list(b.serfs.all())