Fixed #32812 -- Restored immutability of named values from QuerySet.values_list().
Regression in 981a072dd4
.
Thanks pirelle for the report.
This commit is contained in:
parent
f10c52afab
commit
0393b9262d
|
@ -45,4 +45,8 @@ def create_namedtuple_class(*names):
|
||||||
def __reduce__(self):
|
def __reduce__(self):
|
||||||
return unpickle_named_row, (names, tuple(self))
|
return unpickle_named_row, (names, tuple(self))
|
||||||
|
|
||||||
return type('Row', (namedtuple('Row', names),), {'__reduce__': __reduce__})
|
return type(
|
||||||
|
'Row',
|
||||||
|
(namedtuple('Row', names),),
|
||||||
|
{'__reduce__': __reduce__, '__slots__': ()},
|
||||||
|
)
|
||||||
|
|
|
@ -9,4 +9,6 @@ Django 3.2.5 fixes several bugs in 3.2.4.
|
||||||
Bugfixes
|
Bugfixes
|
||||||
========
|
========
|
||||||
|
|
||||||
* ...
|
* Fixed a regression in Django 3.2 that caused a crash of
|
||||||
|
``QuerySet.values_list(…, named=True)`` after ``prefetch_related()``
|
||||||
|
(:ticket:`32812`).
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
from django.db.models.utils import create_namedtuple_class
|
||||||
|
from django.test import SimpleTestCase
|
||||||
|
|
||||||
|
|
||||||
|
class NamedTupleClassTests(SimpleTestCase):
|
||||||
|
def test_immutability(self):
|
||||||
|
row_class = create_namedtuple_class('field1', 'field2')
|
||||||
|
row = row_class('value1', 'value2')
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
row.field3 = 'value3'
|
|
@ -309,6 +309,13 @@ class PrefetchRelatedTests(TestDataMixin, TestCase):
|
||||||
list(Book.objects.prefetch_related(relation))
|
list(Book.objects.prefetch_related(relation))
|
||||||
self.assertEqual(add_q_mock.call_count, 1)
|
self.assertEqual(add_q_mock.call_count, 1)
|
||||||
|
|
||||||
|
def test_named_values_list(self):
|
||||||
|
qs = Author.objects.prefetch_related('books')
|
||||||
|
self.assertCountEqual(
|
||||||
|
[value.name for value in qs.values_list('name', named=True)],
|
||||||
|
['Anne', 'Charlotte', 'Emily', 'Jane'],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class RawQuerySetTests(TestDataMixin, TestCase):
|
class RawQuerySetTests(TestDataMixin, TestCase):
|
||||||
def test_basic(self):
|
def test_basic(self):
|
||||||
|
|
Loading…
Reference in New Issue