diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 10256d479..c788dec16 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -992,6 +992,7 @@ class ModelSerializer(Serializer): if getattr(obj, '_m2m_data', None): for accessor_name, object_list in obj._m2m_data.items(): + [self.save_object(o) for o in object_list] setattr(obj, accessor_name, object_list) del(obj._m2m_data) diff --git a/rest_framework/tests/test_serializer_nested.py b/rest_framework/tests/test_serializer_nested.py index 6d69ffbd0..fcd379bc0 100644 --- a/rest_framework/tests/test_serializer_nested.py +++ b/rest_framework/tests/test_serializer_nested.py @@ -345,3 +345,31 @@ class NestedModelSerializerUpdateTests(TestCase): result = deserialize.object result.save() self.assertEqual(result.id, john.id) + + def test_creation_with_nested_many_to_many_relation(self): + class ManyToManyTargetSerializer(serializers.ModelSerializer): + class Meta: + model = models.ManyToManyTarget + + class ManyToManySourceSerializer(serializers.ModelSerializer): + targets = ManyToManyTargetSerializer(many=True, allow_add_remove=True) + class Meta: + model = models.ManyToManySource + + data = { + 'name': 'source', + 'targets': [{ + 'name': 'target1' + }, { + 'name': 'another target' + }] + } + + source_count = models.ManyToManySource.objects.count() + target_count = models.ManyToManyTarget.objects.count() + + deserialize = ManyToManySourceSerializer(data=data) + self.assertTrue(deserialize.is_valid(), deserialize.errors) + deserialize.save() + self.assertEqual(models.ManyToManySource.objects.count(), source_count + 1) + self.assertEqual(models.ManyToManyTarget.objects.count(), target_count + 2)