summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorIan Foote <python@ian.feete.org>2016-08-15 11:35:12 +1000
committerTim Graham <timograham@gmail.com>2016-08-18 16:05:15 -0400
commit39f35d4b9de223b72c67bb1d12e65669b4e1355b (patch)
tree945d6d64af708824d2b9f0fc552127b0c8d4f866 /tests
parentd4eefc7e2af0d93283ed1c03e0af0a482982b6f0 (diff)
Fixed #25871 -- Added expressions support to QuerySet.values().
Diffstat (limited to 'tests')
-rw-r--r--tests/expressions/test_queryset_values.py64
1 files changed, 64 insertions, 0 deletions
diff --git a/tests/expressions/test_queryset_values.py b/tests/expressions/test_queryset_values.py
new file mode 100644
index 0000000000..f9d35b4385
--- /dev/null
+++ b/tests/expressions/test_queryset_values.py
@@ -0,0 +1,64 @@
+from __future__ import unicode_literals
+
+from django.db.models.aggregates import Sum
+from django.db.models.expressions import F
+from django.test import TestCase
+
+from .models import Company, Employee
+
+
+class ValuesExpressionsTests(TestCase):
+ @classmethod
+ def setUpTestData(cls):
+ Company.objects.create(
+ name='Example Inc.', num_employees=2300, num_chairs=5,
+ ceo=Employee.objects.create(firstname='Joe', lastname='Smith', salary=10)
+ )
+ Company.objects.create(
+ name='Foobar Ltd.', num_employees=3, num_chairs=4,
+ ceo=Employee.objects.create(firstname='Frank', lastname='Meyer', salary=20)
+ )
+ Company.objects.create(
+ name='Test GmbH', num_employees=32, num_chairs=1,
+ ceo=Employee.objects.create(firstname='Max', lastname='Mustermann', salary=30)
+ )
+
+ def test_values_expression(self):
+ self.assertSequenceEqual(
+ Company.objects.values(salary=F('ceo__salary')),
+ [{'salary': 10}, {'salary': 20}, {'salary': 30}],
+ )
+
+ def test_values_expression_group_by(self):
+ # values() applies annotate() first, so values selected are grouped by
+ # id, not firstname.
+ Employee.objects.create(firstname='Joe', lastname='Jones', salary=2)
+ joes = Employee.objects.filter(firstname='Joe')
+ self.assertSequenceEqual(
+ joes.values('firstname', sum_salary=Sum('salary')).order_by('sum_salary'),
+ [{'firstname': 'Joe', 'sum_salary': 2}, {'firstname': 'Joe', 'sum_salary': 10}],
+ )
+ self.assertSequenceEqual(
+ joes.values('firstname').annotate(sum_salary=Sum('salary')),
+ [{'firstname': 'Joe', 'sum_salary': 12}]
+ )
+
+ def test_chained_values_with_expression(self):
+ Employee.objects.create(firstname='Joe', lastname='Jones', salary=2)
+ joes = Employee.objects.filter(firstname='Joe').values('firstname')
+ self.assertSequenceEqual(
+ joes.values('firstname', sum_salary=Sum('salary')),
+ [{'firstname': 'Joe', 'sum_salary': 12}]
+ )
+ self.assertSequenceEqual(
+ joes.values(sum_salary=Sum('salary')),
+ [{'sum_salary': 12}]
+ )
+
+ def test_values_list_expression(self):
+ companies = Company.objects.values_list('name', F('ceo__salary'))
+ self.assertSequenceEqual(companies, [('Example Inc.', 10), ('Foobar Ltd.', 20), ('Test GmbH', 30)])
+
+ def test_values_list_expression_flat(self):
+ companies = Company.objects.values_list(F('ceo__salary'), flat=True)
+ self.assertSequenceEqual(companies, (10, 20, 30))