From 39f35d4b9de223b72c67bb1d12e65669b4e1355b Mon Sep 17 00:00:00 2001 From: Ian Foote Date: Mon, 15 Aug 2016 11:35:12 +1000 Subject: Fixed #25871 -- Added expressions support to QuerySet.values(). --- tests/expressions/test_queryset_values.py | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 tests/expressions/test_queryset_values.py (limited to 'tests') 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)) -- cgit v1.3