Fixed #24719 -- Restored the ability to use interators as queryset related object filters.

This commit is contained in:
Aric Coady 2015-04-27 15:23:56 -07:00 committed by Tim Graham
parent eaeea6f947
commit 9c2d8cde77
3 changed files with 8 additions and 1 deletions

View File

@ -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

View File

@ -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
=============

View File

@ -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)