Serialize mapping attributes

This commit is contained in:
Omar Khan 2015-10-09 07:37:26 +07:00
parent 85cd717ec0
commit 2e24eae49a
2 changed files with 33 additions and 1 deletions

View File

@ -75,7 +75,14 @@ def get_attribute(instance, attrs):
return None
try:
if isinstance(instance, collections.Mapping):
try:
instance = instance[attr]
except KeyError as keyerror:
# Does the mapping has a method or property with that name?
try:
instance = getattr(instance, attr)
except AttributeError:
raise keyerror
else:
instance = getattr(instance, attr)
except ObjectDoesNotExist:

View File

@ -309,3 +309,28 @@ class TestCacheSerializerData:
pickled = pickle.dumps(serializer.data)
data = pickle.loads(pickled)
assert data == {'field1': 'a', 'field2': 'b'}
class TestMapping:
def setup(self):
class ExampleSerializer(serializers.Serializer):
entries = serializers.ListField()
last_entry = serializers.CharField()
self.Serializer = ExampleSerializer
self.data = {'entries': ['a', 'b', 'c']}
self.expected = {'entries': ['a', 'b', 'c'], 'last_entry': 'c'}
def test_mapping_with_method(self):
class Mapping(dict):
def last_entry(self):
return self['entries'][-1]
serializer = self.Serializer(Mapping(self.data))
assert serializer.data == self.expected
def test_mapping_with_property(self):
class Mapping(dict):
@property
def last_entry(self):
return self['entries'][-1]
serializer = self.Serializer(Mapping(self.data))
assert serializer.data == self.expected