This commit is contained in:
Omar Khan 2016-05-22 15:23:11 +00:00
commit f16c9485f0
2 changed files with 33 additions and 1 deletions

View File

@ -75,7 +75,14 @@ def get_attribute(instance, attrs):
return None return None
try: try:
if isinstance(instance, collections.Mapping): if isinstance(instance, collections.Mapping):
try:
instance = instance[attr] 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: else:
instance = getattr(instance, attr) instance = getattr(instance, attr)
except ObjectDoesNotExist: except ObjectDoesNotExist:

View File

@ -309,3 +309,28 @@ class TestCacheSerializerData:
pickled = pickle.dumps(serializer.data) pickled = pickle.dumps(serializer.data)
data = pickle.loads(pickled) data = pickle.loads(pickled)
assert data == {'field1': 'a', 'field2': 'b'} 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