mirror of
https://github.com/django/django.git
synced 2025-08-30 15:27:40 +00:00
Fixed #25871 -- Added expressions support to QuerySet.values().
This commit is contained in:
parent
d4eefc7e2a
commit
39f35d4b9d
4 changed files with 115 additions and 7 deletions
64
tests/expressions/test_queryset_values.py
Normal file
64
tests/expressions/test_queryset_values.py
Normal file
|
@ -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))
|
Loading…
Add table
Add a link
Reference in a new issue