Fix iteration on querysets.

If iteration of a queryset was interrupted (by a break, or a caught
error), the next iterator would start from the second element as the
cursor had already moved to the first. This is fixed by adding a rewind
into the __iter__ method.
This commit is contained in:
Marc Tamlyn 2011-10-05 13:26:57 +01:00
parent 89c44cd14e
commit 219d316b49
2 changed files with 7 additions and 0 deletions

View File

@ -1342,6 +1342,7 @@ class QuerySet(object):
raise OperationError(u'Update failed [%s]' % unicode(e))
def __iter__(self):
self.rewind()
return self
def _sub_js_fields(self, code):

View File

@ -567,7 +567,13 @@ class QuerySetTest(unittest.TestCase):
people1 = [person for person in queryset]
people2 = [person for person in queryset]
# Check that it still works even if iteration is interrupted.
for person in queryset:
break
people3 = [person for person in queryset]
self.assertEqual(people1, people2)
self.assertEqual(people1, people3)
def test_repr_iteration(self):
"""Ensure that QuerySet __repr__ can handle loops