mirror of https://github.com/django/django.git
[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 2cd0edaa47
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…
Reference in New Issue