mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-27 08:29:59 +03:00
Merge 1128fe3baf
into eb14278a3b
This commit is contained in:
commit
7c72acf711
|
@ -118,6 +118,7 @@ class BaseSerializer(Field):
|
||||||
self._data = None
|
self._data = None
|
||||||
self._files = None
|
self._files = None
|
||||||
self._errors = None
|
self._errors = None
|
||||||
|
self._instance = instance
|
||||||
|
|
||||||
#####
|
#####
|
||||||
# Methods to determine which fields to use when (de)serializing objects.
|
# Methods to determine which fields to use when (de)serializing objects.
|
||||||
|
@ -257,7 +258,7 @@ class BaseSerializer(Field):
|
||||||
You should override this method to control how deserialized objects
|
You should override this method to control how deserialized objects
|
||||||
are instantiated.
|
are instantiated.
|
||||||
"""
|
"""
|
||||||
if instance is not None:
|
if instance is not None and not hasattr(instance, '__iter__'):
|
||||||
instance.update(attrs)
|
instance.update(attrs)
|
||||||
return instance
|
return instance
|
||||||
return attrs
|
return attrs
|
||||||
|
@ -276,7 +277,12 @@ class BaseSerializer(Field):
|
||||||
"""
|
"""
|
||||||
if hasattr(data, '__iter__') and not isinstance(data, dict):
|
if hasattr(data, '__iter__') and not isinstance(data, dict):
|
||||||
# TODO: error data when deserializing lists
|
# TODO: error data when deserializing lists
|
||||||
return (self.from_native(item) for item in data)
|
objects = []
|
||||||
|
for i, item in enumerate(data):
|
||||||
|
if hasattr(self.object, '__iter__'):
|
||||||
|
self._instance = self.object[i]
|
||||||
|
objects.append(self.from_native(item, files))
|
||||||
|
return objects
|
||||||
|
|
||||||
self._errors = {}
|
self._errors = {}
|
||||||
if data is not None or files is not None:
|
if data is not None or files is not None:
|
||||||
|
@ -286,7 +292,7 @@ class BaseSerializer(Field):
|
||||||
self._errors['non_field_errors'] = ['No input provided']
|
self._errors['non_field_errors'] = ['No input provided']
|
||||||
|
|
||||||
if not self._errors:
|
if not self._errors:
|
||||||
return self.restore_object(attrs, instance=getattr(self, 'object', None))
|
return self.restore_object(attrs, instance=getattr(self, '_instance', None))
|
||||||
|
|
||||||
def field_to_native(self, obj, field_name):
|
def field_to_native(self, obj, field_name):
|
||||||
"""
|
"""
|
||||||
|
@ -337,6 +343,10 @@ class BaseSerializer(Field):
|
||||||
"""
|
"""
|
||||||
Save the deserialized object and return it.
|
Save the deserialized object and return it.
|
||||||
"""
|
"""
|
||||||
|
if hasattr(self.object, '__iter__'):
|
||||||
|
for obj in self.object:
|
||||||
|
obj.save()
|
||||||
|
else:
|
||||||
self.object.save()
|
self.object.save()
|
||||||
return self.object
|
return self.object
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ class CommentSerializer(serializers.Serializer):
|
||||||
sub_comment = serializers.Field(source='get_sub_comment.sub_comment')
|
sub_comment = serializers.Field(source='get_sub_comment.sub_comment')
|
||||||
|
|
||||||
def restore_object(self, data, instance=None):
|
def restore_object(self, data, instance=None):
|
||||||
if instance is None:
|
if instance is None or hasattr(instance, '__iter__'):
|
||||||
return Comment(**data)
|
return Comment(**data)
|
||||||
for key, val in data.items():
|
for key, val in data.items():
|
||||||
setattr(instance, key, val)
|
setattr(instance, key, val)
|
||||||
|
@ -881,3 +881,58 @@ class NestedSerializerContextTests(TestCase):
|
||||||
|
|
||||||
# This will raise RuntimeError if context doesn't get passed correctly to the nested Serializers
|
# This will raise RuntimeError if context doesn't get passed correctly to the nested Serializers
|
||||||
AlbumCollectionSerializer(album_collection, context={'context_item': 'album context'}).data
|
AlbumCollectionSerializer(album_collection, context={'context_item': 'album context'}).data
|
||||||
|
|
||||||
|
|
||||||
|
class MultipleObjectsTests(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.comments = [Comment(
|
||||||
|
'tom@example.com',
|
||||||
|
'Happy new year!',
|
||||||
|
datetime.datetime(2012, 1, 1)
|
||||||
|
),
|
||||||
|
Comment(
|
||||||
|
'seb@example.com',
|
||||||
|
'Thank you!',
|
||||||
|
datetime.datetime(2012, 1, 2)
|
||||||
|
)]
|
||||||
|
self.data = [{
|
||||||
|
'email': 'tom@example.com',
|
||||||
|
'content': 'Happy new year!',
|
||||||
|
'created': datetime.datetime(2012, 1, 1),
|
||||||
|
'sub_comment': 'This wont change'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'email': 'seb@example.com',
|
||||||
|
'content': 'Thank you!',
|
||||||
|
'created': datetime.datetime(2012, 1, 2),
|
||||||
|
'sub_comment': 'This wont change'
|
||||||
|
}]
|
||||||
|
self.expected = [{
|
||||||
|
'email': 'tom@example.com',
|
||||||
|
'content': 'Happy new year!',
|
||||||
|
'created': datetime.datetime(2012, 1, 1),
|
||||||
|
'sub_comment': 'And Merry Christmas!'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'email': 'seb@example.com',
|
||||||
|
'content': 'Thank you!',
|
||||||
|
'created': datetime.datetime(2012, 1, 2),
|
||||||
|
'sub_comment': 'And Merry Christmas!'
|
||||||
|
}]
|
||||||
|
|
||||||
|
def test_create(self):
|
||||||
|
serializer = CommentSerializer(data=self.data)
|
||||||
|
expected = self.comments
|
||||||
|
self.assertEquals(serializer.is_valid(), True)
|
||||||
|
self.assertEquals(serializer.object, expected)
|
||||||
|
self.assertFalse(serializer.object is expected)
|
||||||
|
self.assertEquals(serializer.data, self.expected)
|
||||||
|
|
||||||
|
def test_update(self):
|
||||||
|
serializer = CommentSerializer(instance=self.comments, data=self.data)
|
||||||
|
expected = self.comments
|
||||||
|
self.assertEquals(serializer.is_valid(), True)
|
||||||
|
self.assertEquals(serializer.object, expected)
|
||||||
|
for obj, exp in zip(serializer.object, expected):
|
||||||
|
self.assertTrue(obj is exp)
|
||||||
|
self.assertEquals(serializer.data, self.expected)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user