Skip to content

Commit

Permalink
Merge pull request #321 from lukaslundgren/master
Browse files Browse the repository at this point in the history
Handle annotation fields when using values_list
  • Loading branch information
deschler committed Jul 3, 2015
2 parents 620efeb + a6511bc commit d0a3fe8
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
15 changes: 11 additions & 4 deletions modeltranslation/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -445,14 +445,21 @@ def _clone(self, klass=None, setup=False, **kwargs):

class FallbackValuesListQuerySet(FallbackValuesQuerySet):
def iterator(self):
fields = self.original_fields
if hasattr(self, 'aggregate_names'):
# Django <1.8
fields += tuple(self.aggregate_names)
if hasattr(self, 'annotation_names'):
# Django >=1.8
fields += tuple(self.annotation_names)
for row in super(FallbackValuesListQuerySet, self).iterator():
if self.flat and len(self.original_fields) == 1:
yield row[self.original_fields[0]]
if self.flat and len(fields) == 1:
yield row[fields[0]]
else:
yield tuple(row[f] for f in self.original_fields)
yield tuple(row[f] for f in fields)

def _setup_query(self):
self.original_fields = self._fields
self.original_fields = tuple(self._fields)
super(FallbackValuesListQuerySet, self)._setup_query()

def _clone(self, *args, **kwargs):
Expand Down
10 changes: 9 additions & 1 deletion modeltranslation/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from django.core.files.storage import default_storage
from django.core.management import call_command
from django.db import IntegrityError
from django.db.models import Q, F
from django.db.models import Q, F, Count
from django.test import TestCase, TransactionTestCase
from django.test.utils import override_settings
from django.utils import six
Expand Down Expand Up @@ -2551,6 +2551,14 @@ def test_values(self):
'description': None, 'description_en': None, 'description_de': None},
])

def test_values_list_annotation(self):
models.TestModel(title='foo').save()
models.TestModel(title='foo').save()
self.assertEqual(
list(models.TestModel.objects.all().values_list('title').annotate(Count('id'))),
[('foo', 2)]
)

def test_custom_manager(self):
"""Test if user-defined manager is still working"""
n = models.CustomManagerTestModel(title='')
Expand Down

0 comments on commit d0a3fe8

Please sign in to comment.