diff --git a/mongoengine/queryset/queryset.py b/mongoengine/queryset/queryset.py index 6e5f7220e..218c548f0 100644 --- a/mongoengine/queryset/queryset.py +++ b/mongoengine/queryset/queryset.py @@ -75,7 +75,8 @@ def _iter_results(self): yield self._result_cache[pos] pos += 1 if not self._has_more: - raise StopIteration + if pos == len(self): + raise StopIteration if len(self._result_cache) <= pos: self._populate_cache() @@ -155,6 +156,8 @@ def __iter__(self): queryset.rewind() return queryset + def __len__(self): + return len([1 for i in self]) class QuerySetNoDeRef(QuerySet): """Special no_dereference QuerySet""" diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index a2b839d65..f1401b725 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -4822,5 +4822,30 @@ class Doc(Document): self.assertEqual(1, Doc.objects(item__type__="axe").count()) + def test_len_during_iteration(self): + """ + Tests that calling len on a queyset during iteration doesn't stop + paging. + """ + + class Data(Document): + pass + + for i in xrange(500): + Data().save() + + records = Data.objects.limit(250) + len(records) + for i, r in enumerate(records): + if i == 58: + len(records) + self.assertEqual(i, 249) + + records = Data.objects.limit(250) + for i, r in enumerate(records): + if i == 58: + len(records) + self.assertEqual(i, 249) + if __name__ == '__main__': unittest.main()