diff options
| -rw-r--r-- | rest_framework/serializers.py | 2 | ||||
| -rw-r--r-- | tests/test_model_serializer.py | 33 | 
2 files changed, 35 insertions, 0 deletions
| diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index d2740fc2..d9f9c8cb 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -24,6 +24,7 @@ from rest_framework.utils.field_mapping import (      lookup_class  )  import copy +import inspect  # Note: We do the following so that users of the framework can use this style:  # @@ -268,6 +269,7 @@ class ListSerializer(BaseSerializer):      def __init__(self, *args, **kwargs):          self.child = kwargs.pop('child', copy.deepcopy(self.child))          assert self.child is not None, '`child` is a required argument.' +        assert not inspect.isclass(self.child), '`child` has not been instantiated.'          self.context = kwargs.pop('context', {})          kwargs.pop('partial', None) diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index d518dd58..d9f9efbe 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -473,3 +473,36 @@ class TestIntegration(TestCase):              'through': []          }          self.assertEqual(serializer.data, expected) + + +# Tests for bulk create using `ListSerializer`. + +class BulkCreateModel(models.Model): +    name = models.CharField(max_length=10) + + +class TestBulkCreate(TestCase): +    def test_bulk_create(self): +        class BasicModelSerializer(serializers.ModelSerializer): +            class Meta: +                model = BulkCreateModel +                fields = ('name',) + +        class BulkCreateSerializer(serializers.ListSerializer): +            child = BasicModelSerializer() + +        data = [{'name': 'a'}, {'name': 'b'}, {'name': 'c'}] +        serializer = BulkCreateSerializer(data=data) +        assert serializer.is_valid() + +        # Objects are returned by save(). +        instances = serializer.save() +        assert len(instances) == 3 +        assert [item.name for item in instances] == ['a', 'b', 'c'] + +        # Objects have been created in the database. +        assert BulkCreateModel.objects.count() == 3 +        assert list(BulkCreateModel.objects.values_list('name', flat=True)) == ['a', 'b', 'c'] + +        # Serializer returns correct data. +        assert serializer.data == data | 
