mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-01-23 15:54:16 +03:00
commit
6ffcd7ba36
|
@ -22,7 +22,16 @@ class DictWithMetadata(dict):
|
|||
"""
|
||||
A dict-like object, that can have additional properties attached.
|
||||
"""
|
||||
pass
|
||||
def __getstate__(self):
|
||||
"""
|
||||
Used by pickle (e.g., caching).
|
||||
Overriden to remove metadata from the dict, since it shouldn't be pickled
|
||||
and may in some instances be unpickleable.
|
||||
"""
|
||||
# return an instance of the first dict in MRO that isn't a DictWithMetadata
|
||||
for base in self.__class__.__mro__:
|
||||
if not isinstance(base, DictWithMetadata) and isinstance(base, dict):
|
||||
return base(self)
|
||||
|
||||
|
||||
class SortedDictWithMetadata(SortedDict, DictWithMetadata):
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import datetime
|
||||
import datetime, pickle
|
||||
from django.test import TestCase
|
||||
from rest_framework import serializers
|
||||
from rest_framework.tests.models import (ActionItem, Anchor, BasicModel,
|
||||
|
@ -682,3 +682,27 @@ class BlankFieldTests(TestCase):
|
|||
"""
|
||||
serializer = self.not_blank_model_serializer_class(data=self.data)
|
||||
self.assertEquals(serializer.is_valid(), False)
|
||||
|
||||
|
||||
#test for issue #460
|
||||
class SerializerPickleTests(TestCase):
|
||||
"""
|
||||
Test pickleability of the output of Serializers
|
||||
"""
|
||||
def test_pickle_simple_model_serializer_data(self):
|
||||
"""
|
||||
Test simple serializer
|
||||
"""
|
||||
pickle.dumps(PersonSerializer(Person(name="Methusela", age=969)).data)
|
||||
|
||||
def test_pickle_inner_serializer(self):
|
||||
"""
|
||||
Test pickling a serializer whose resulting .data (a SortedDictWithMetadata) will
|
||||
have unpickleable meta data--in order to make sure metadata doesn't get pulled into the pickle.
|
||||
See DictWithMetadata.__getstate__
|
||||
"""
|
||||
class InnerPersonSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Person
|
||||
fields = ('name', 'age')
|
||||
pickle.dumps(InnerPersonSerializer(Person(name="Noah", age=950)).data)
|
||||
|
|
Loading…
Reference in New Issue
Block a user