create multiple objects at once with serializer

This commit is contained in:
Sebastien Beal 2012-12-23 07:40:15 +09:00
parent 68125d26cc
commit 2edf444051
2 changed files with 54 additions and 4 deletions

View File

@ -257,7 +257,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 +276,7 @@ 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) return [self.from_native(item, files) for item in data]
self._errors = {} self._errors = {}
if data is not None or files is not None: if data is not None or files is not None:
@ -334,7 +334,11 @@ class BaseSerializer(Field):
""" """
Save the deserialized object and return it. 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 return self.object

View File

@ -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)
@ -831,3 +831,49 @@ 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)