[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 2cd0edaa477b327024e4007c8eaf46646dcd0f21 from master.
This commit is contained in:
parent
2683e8ea20
commit
d1e87eb3ba
@ -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)
|
||||
|
@ -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)
|
Loading…
x
Reference in New Issue
Block a user