mirror of
https://github.com/django/django.git
synced 2025-08-03 18:38:50 +00:00
Fixed #15648 -- Allowed QuerySet.values_list() to return a namedtuple.
This commit is contained in:
parent
a027447f56
commit
f3c9562143
4 changed files with 101 additions and 5 deletions
|
@ -2248,6 +2248,44 @@ class ValuesQuerysetTests(TestCase):
|
|||
with self.assertRaisesMessage(FieldError, msg):
|
||||
Tag.objects.values_list('name__foo')
|
||||
|
||||
def test_named_values_list_flat(self):
|
||||
msg = "'flat' and 'named' can't be used together."
|
||||
with self.assertRaisesMessage(TypeError, msg):
|
||||
Number.objects.values_list('num', flat=True, named=True)
|
||||
|
||||
def test_named_values_list_bad_field_name(self):
|
||||
msg = "Type names and field names must be valid identifiers: '1'"
|
||||
with self.assertRaisesMessage(ValueError, msg):
|
||||
Number.objects.extra(select={'1': 'num+1'}).values_list('1', named=True).first()
|
||||
|
||||
def test_named_values_list_with_fields(self):
|
||||
qs = Number.objects.extra(select={'num2': 'num+1'}).annotate(Count('id'))
|
||||
values = qs.values_list('num', 'num2', named=True).first()
|
||||
self.assertEqual(type(values).__name__, 'Row')
|
||||
self.assertEqual(values._fields, ('num', 'num2'))
|
||||
self.assertEqual(values.num, 72)
|
||||
self.assertEqual(values.num2, 73)
|
||||
|
||||
def test_named_values_list_without_fields(self):
|
||||
qs = Number.objects.extra(select={'num2': 'num+1'}).annotate(Count('id'))
|
||||
values = qs.values_list(named=True).first()
|
||||
self.assertEqual(type(values).__name__, 'Row')
|
||||
self.assertEqual(values._fields, ('num2', 'id', 'num', 'id__count'))
|
||||
self.assertEqual(values.num, 72)
|
||||
self.assertEqual(values.num2, 73)
|
||||
self.assertEqual(values.id__count, 1)
|
||||
|
||||
def test_named_values_list_expression_with_default_alias(self):
|
||||
expr = Count('id')
|
||||
values = Number.objects.annotate(id__count1=expr).values_list(expr, 'id__count1', named=True).first()
|
||||
self.assertEqual(values._fields, ('id__count2', 'id__count1'))
|
||||
|
||||
def test_named_values_list_expression(self):
|
||||
expr = F('num') + 1
|
||||
qs = Number.objects.annotate(combinedexpression1=expr).values_list(expr, 'combinedexpression1', named=True)
|
||||
values = qs.first()
|
||||
self.assertEqual(values._fields, ('combinedexpression2', 'combinedexpression1'))
|
||||
|
||||
|
||||
class QuerySetSupportsPythonIdioms(TestCase):
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue