mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-08 06:14:47 +03:00
Serialize mapping attributes
This commit is contained in:
parent
85cd717ec0
commit
2e24eae49a
|
@ -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):
|
||||||
instance = instance[attr]
|
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:
|
else:
|
||||||
instance = getattr(instance, attr)
|
instance = getattr(instance, attr)
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user