Fixed #29067 -- Fixed regression in QuerySet.values_list(..., flat=True) followed by annotate().

This commit is contained in:
Jon Dufresne 2018-01-25 20:28:34 -08:00 committed by Tim Graham
parent d0b44c44ef
commit 3187c89d6f
3 changed files with 10 additions and 2 deletions

View File

@ -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:

View File

@ -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`).

View File

@ -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):