Fixed the many to many behavior.

This commit is contained in:
Xavier Ordoquy 2014-03-06 07:47:11 +01:00
parent 45ae5081f7
commit 7750138643
2 changed files with 29 additions and 0 deletions

View File

@ -992,6 +992,7 @@ class ModelSerializer(Serializer):
if getattr(obj, '_m2m_data', None): if getattr(obj, '_m2m_data', None):
for accessor_name, object_list in obj._m2m_data.items(): 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) setattr(obj, accessor_name, object_list)
del(obj._m2m_data) del(obj._m2m_data)

View File

@ -345,3 +345,31 @@ class NestedModelSerializerUpdateTests(TestCase):
result = deserialize.object result = deserialize.object
result.save() result.save()
self.assertEqual(result.id, john.id) 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)