mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-24 23:19:47 +03:00
create multiple objects at once with serializer
This commit is contained in:
parent
68125d26cc
commit
2edf444051
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue
Block a user