From 2edf4440511a04e703c0e1270f6012e1c9e1ea9c Mon Sep 17 00:00:00 2001 From: Sebastien Beal Date: Sun, 23 Dec 2012 07:40:15 +0900 Subject: [PATCH] create multiple objects at once with serializer --- rest_framework/serializers.py | 10 +++++-- rest_framework/tests/serializer.py | 48 +++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 8156bc185..970227331 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -257,7 +257,7 @@ class BaseSerializer(Field): You should override this method to control how deserialized objects are instantiated. """ - if instance is not None: + if instance is not None and not hasattr(instance, '__iter__'): instance.update(attrs) return instance return attrs @@ -276,7 +276,7 @@ class BaseSerializer(Field): """ if hasattr(data, '__iter__') and not isinstance(data, dict): # TODO: error data when deserializing lists - return (self.from_native(item) for item in data) + return [self.from_native(item, files) for item in data] self._errors = {} if data is not None or files is not None: @@ -334,7 +334,11 @@ class BaseSerializer(Field): """ Save the deserialized object and return it. """ - self.object.save() + if hasattr(self.object, '__iter__'): + for obj in self.object: + obj.save() + else: + self.object.save() return self.object diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index 6ea4b4246..05d976400 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -34,7 +34,7 @@ class CommentSerializer(serializers.Serializer): sub_comment = serializers.Field(source='get_sub_comment.sub_comment') def restore_object(self, data, instance=None): - if instance is None: + if instance is None or hasattr(instance, '__iter__'): return Comment(**data) for key, val in data.items(): setattr(instance, key, val) @@ -831,3 +831,49 @@ class NestedSerializerContextTests(TestCase): # This will raise RuntimeError if context doesn't get passed correctly to the nested Serializers 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)