Skip to content

Commit e59b3d1

Browse files
committed
Make ReturnDict cachable. Closes #2360.
1 parent 9d24809 commit e59b3d1

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

rest_framework/utils/serializer_helpers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ def copy(self):
1919
def __repr__(self):
2020
return dict.__repr__(self)
2121

22+
def __reduce__(self):
23+
# Pickling these objects will drop the .serializer backlink,
24+
# but preserve the raw data.
25+
return (dict, (dict(self),))
26+
2227

2328
class ReturnList(list):
2429
"""
@@ -33,6 +38,11 @@ def __init__(self, *args, **kwargs):
3338
def __repr__(self):
3439
return list.__repr__(self)
3540

41+
def __reduce__(self):
42+
# Pickling these objects will drop the .serializer backlink,
43+
# but preserve the raw data.
44+
return (list, (list(self),))
45+
3646

3747
class BoundField(object):
3848
"""

tests/test_serializer.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from .utils import MockObject
44
from rest_framework import serializers
55
from rest_framework.compat import unicode_repr
6+
import pickle
67
import pytest
78

89

@@ -278,3 +279,19 @@ class ExampleSerializer(serializers.Serializer):
278279
serializer = ExampleSerializer(instance)
279280
with pytest.raises(AttributeError):
280281
serializer.data
282+
283+
284+
class TestCacheSerializerData:
285+
def test_cache_serializer_data(self):
286+
"""
287+
Caching serializer data with pickle will drop the serializer info,
288+
but does preserve the data itself.
289+
"""
290+
class ExampleSerializer(serializers.Serializer):
291+
field1 = serializers.CharField()
292+
field2 = serializers.CharField()
293+
294+
serializer = ExampleSerializer({'field1': 'a', 'field2': 'b'})
295+
pickled = pickle.dumps(serializer.data)
296+
data = pickle.loads(pickled)
297+
assert data == {'field1': 'a', 'field2': 'b'}

0 commit comments

Comments
 (0)