Commit d1e87eb3 authored by Grzegorz Nosek's avatar Grzegorz Nosek Committed by Jacob Kaplan-Moss
Browse files

[1.5.x] Fixed #19895 -- Made second iteration over invalid queryset raise an exception too

When iteration over a queryset raised an exception, the result cache
remained initialized with an empty list, so subsequent iterations returned
an empty list instead of raising an exception

Backport of 2cd0edaa from master.
parent 2683e8ea
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ class QuerySet(object):
            len(self)

        if self._result_cache is None:
            self._iter = self.iterator()
            self._iter = self._safe_iterator(self.iterator())
            self._result_cache = []
        if self._iter:
            return self._result_iter()
@@ -337,6 +337,18 @@ class QuerySet(object):

            yield obj

    def _safe_iterator(self, iterator):
        # ensure result cache is cleared when iterating over a queryset
        # raises an exception
        try:
            for item in iterator:
                yield item
        except StopIteration:
            raise
        except Exception:
            self._result_cache = None
            raise

    def aggregate(self, *args, **kwargs):
        """
        Returns a dictionary containing the calculations (aggregation)
+6 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals

from datetime import datetime

from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, FieldError
from django.db.models.fields import Field, FieldDoesNotExist
from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature
from django.utils import six
@@ -639,3 +639,8 @@ class ModelTest(TestCase):
        Article.objects.bulk_create([Article(headline=lazy, pub_date=datetime.now())])
        article = Article.objects.get()
        self.assertEqual(article.headline, notlazy)

    def test_invalid_qs_list(self):
        qs = Article.objects.order_by('invalid_column')
        self.assertRaises(FieldError, list, qs)
        self.assertRaises(FieldError, list, qs)
 No newline at end of file