#12608: Inconsistent results from values and values_list when using annotate
---------------------------------------------------+------------------------
Reporter: mattmcc | Owner: nobody
Status: new | Milestone: 1.2
Component: Database layer (models, ORM) | Version: SVN
Resolution: | Keywords: values_list annotate
Stage: Accepted | Has_patch: 1
Needs_docs: 0 | Needs_tests: 0
Needs_better_patch: 0 |
---------------------------------------------------+------------------------
Changes (by coleifer):
* has_patch: 0 => 1
Comment:
I patched the ValuesList iterator to include aggregates in the fields if
specified:
{{{
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 8cb3dbe..31b3333 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -954,7 +954,8 @@ class ValuesListQuerySet(ValuesQuerySet):
# If a field list has been specified, use it. Otherwise, use
the
# full list of fields, including extras and aggregates.
if self._fields:
- fields = self._fields
+ fields = list(self._fields) + filter(lambda f: f not in
self._fields,
+ aggregate_names)
else:
fields = names
diff --git a/tests/modeltests/aggregation/models.py
b/tests/modeltests/aggregation/models.py
index 9ed638e..0e8d881 100644
--- a/tests/modeltests/aggregation/models.py
+++ b/tests/modeltests/aggregation/models.py
@@ -362,4 +362,7 @@ True
>>>
Book.objects.filter(pk=1).annotate(mean_age=Avg('authors__age')).values_list('mean_age',
flat=True)
[34.5]
+>>>
Book.objects.values_list('price').annotate(count=Count('price')).order_by('-count',
'price')
+[(Decimal('29.69'), 2), (Decimal('23.09'), 1), (Decimal('30'), 1),
(Decimal('75'), 1), (Decimal('82.8'), 1)]
+
"""}
}}}
{{{
In [1]: from django.contrib.auth.models import User
In [2]: from django.db.models import Count
In [3]: User.objects.values_list('email').annotate(Count('email'))
Out[3]: [(
u'us...@example.com', 2)]
In [4]: User.objects.values('email').annotate(Count('email'))
Out[4]: [{'email__count': 2, 'email':
u'us...@example.com'}]
In [5]: User.objects.values_list('email')
Out[5]: [(
u'us...@example.com',), (
u'us...@example.com',)]
}}}
--
Ticket URL: <
http://code.djangoproject.com/ticket/12608#comment:3>