summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAric Coady <aric.coady@gmail.com>2015-04-27 15:23:56 -0700
committerTim Graham <timograham@gmail.com>2015-04-28 10:51:27 -0400
commit9c2d8cde77ee6edd407e92f93eacd4624290394f (patch)
tree8d699d9ac2ab6580439c62a9b7dbcb6bd5f7f87d
parenteaeea6f94701547ce1b50dbcf5cf71460e9e4c91 (diff)
Fixed #24719 -- Restored the ability to use interators as queryset related object filters.
-rw-r--r--django/db/models/sql/query.py5
-rw-r--r--docs/releases/1.8.1.txt3
-rw-r--r--tests/queries/tests.py1
3 files changed, 8 insertions, 1 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index b514cc4783..d84e3aa681 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -8,7 +8,7 @@ all about the internals of models in order to get the information it needs.
"""
import copy
import warnings
-from collections import Mapping, OrderedDict
+from collections import Iterator, Mapping, OrderedDict
from itertools import chain, count, product
from string import ascii_uppercase
@@ -1148,6 +1148,9 @@ class Query(object):
field, sources, opts, join_list, path = self.setup_joins(
parts, opts, alias, can_reuse=can_reuse, allow_many=allow_many)
+ # Prevent iterator from being consumed by check_related_objects()
+ if isinstance(value, Iterator):
+ value = list(value)
self.check_related_objects(field, value, opts)
# split_exclude() needs to know which joins were generated for the
diff --git a/docs/releases/1.8.1.txt b/docs/releases/1.8.1.txt
index 9593c13551..6f668231fd 100644
--- a/docs/releases/1.8.1.txt
+++ b/docs/releases/1.8.1.txt
@@ -69,6 +69,9 @@ Bugfixes
* Fixed a migration crash when applying migrations with model managers on
Python 3 that were generated on Python 2 (:ticket:`24701`).
+* Restored the ability to use interators as queryset filter arguments
+ (:ticket:`24719`).
+
Optimizations
=============
diff --git a/tests/queries/tests.py b/tests/queries/tests.py
index b4ea646fde..71c32c6bda 100644
--- a/tests/queries/tests.py
+++ b/tests/queries/tests.py
@@ -3502,6 +3502,7 @@ class RelatedLookupTypeTests(TestCase):
# child objects
self.assertQuerysetEqual(ObjectB.objects.filter(objecta__in=[self.coa]), [])
self.assertQuerysetEqual(ObjectB.objects.filter(objecta__in=[self.poa, self.coa]).order_by('name'), out_b)
+ self.assertQuerysetEqual(ObjectB.objects.filter(objecta__in=iter([self.poa, self.coa])).order_by('name'), out_b)
# parent objects
self.assertQuerysetEqual(ObjectC.objects.exclude(childobjecta=self.oa), out_c)