diff --git a/django/db/models/query.py b/django/db/models/query.py index 256a817a64..e17f8da1a8 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -7,7 +7,6 @@ import operator import warnings from collections import OrderedDict, namedtuple from functools import lru_cache -from itertools import chain from django.conf import settings from django.core import exceptions @@ -173,7 +172,8 @@ class FlatValuesListIterable(BaseIterable): def __iter__(self): queryset = self.queryset compiler = queryset.query.get_compiler(queryset.db) - return chain.from_iterable(compiler.results_iter(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)) + for row in compiler.results_iter(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size): + yield row[0] class QuerySet: diff --git a/docs/releases/2.0.2.txt b/docs/releases/2.0.2.txt index 92026be5f8..4a06ccb792 100644 --- a/docs/releases/2.0.2.txt +++ b/docs/releases/2.0.2.txt @@ -14,3 +14,6 @@ Bugfixes * Fixed incorrect foreign key nullification if a model has two foreign keys to the same model and a target model is deleted (:ticket:`29016`). + +* Fixed regression in the use of ``QuerySet.values_list(..., flat=True)`` + followed by ``annotate()`` (:ticket:`29067`). diff --git a/tests/aggregation_regress/tests.py b/tests/aggregation_regress/tests.py index 91e993a6d1..9c8bac0d21 100644 --- a/tests/aggregation_regress/tests.py +++ b/tests/aggregation_regress/tests.py @@ -1475,6 +1475,11 @@ class AggregationTests(TestCase): vals2 = Book.objects.aggregate(result=Sum('rating') - Value(4.0)) self.assertEqual(vals1, vals2) + def test_annotate_values_list_flat(self): + """Find ages that are shared by at least two authors.""" + qs = Author.objects.values_list('age', flat=True).annotate(age_count=Count('age')).filter(age_count__gt=1) + self.assertSequenceEqual(qs, [29]) + class JoinPromotionTests(TestCase): def test_ticket_21150(self):