aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2014-09-18 15:47:27 +0100
committerTom Christie2014-09-18 15:47:27 +0100
commitf90049316a3ecca6c92e10b57bfa5becbceff386 (patch)
tree0709bde8993e414f06459d63ebfb01829dfa0ea0
parent106362b437f45e04faaea759df57a66a8a2d7cfd (diff)
downloaddjango-rest-framework-f90049316a3ecca6c92e10b57bfa5becbceff386.tar.bz2
Added a model update integration test
-rw-r--r--rest_framework/serializers.py13
-rw-r--r--tests/test_model_serializer.py43
2 files changed, 49 insertions, 7 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 03e20df8..d2740fc2 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -350,17 +350,16 @@ class ModelSerializer(Serializer):
# as they require that the instance has already been saved.
info = model_meta.get_field_info(ModelClass)
many_to_many = {}
- for key, relation_info in info.relations.items():
- if relation_info.to_many and (key in attrs):
- many_to_many[key] = attrs.pop(key)
+ for field_name, relation_info in info.relations.items():
+ if relation_info.to_many and (field_name in attrs):
+ many_to_many[field_name] = attrs.pop(field_name)
instance = ModelClass.objects.create(**attrs)
- # Save many to many relationships after the instance is created.
+ # Save many-to-many relationships after the instance is created.
if many_to_many:
- for key, value in many_to_many.items():
- setattr(instance, key, value)
- instance.save()
+ for field_name, value in many_to_many.items():
+ setattr(instance, field_name, value)
return instance
diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py
index 6f207e02..e0120c31 100644
--- a/tests/test_model_serializer.py
+++ b/tests/test_model_serializer.py
@@ -413,3 +413,46 @@ class TestIntegration(TestCase):
'through': []
}
self.assertEqual(serializer.data, expected)
+
+ def test_pk_update(self):
+ new_foreign_key = ForeignKeyTargetModel.objects.create(
+ name='foreign_key'
+ )
+ new_one_to_one = OneToOneTargetModel.objects.create(
+ name='one_to_one'
+ )
+ new_many_to_many = [
+ ManyToManyTargetModel.objects.create(
+ name='new many_to_many (%d)' % idx
+ ) for idx in range(3)
+ ]
+ data = {
+ 'foreign_key': new_foreign_key.pk,
+ 'one_to_one': new_one_to_one.pk,
+ 'many_to_many': [item.pk for item in new_many_to_many],
+ }
+
+ # Serializer should validate okay.
+ serializer = self.serializer_cls(self.instance, data=data)
+ assert serializer.is_valid()
+
+ # Creating the instance, relationship attributes should be set.
+ instance = serializer.save()
+ assert instance.foreign_key.pk == new_foreign_key.pk
+ assert instance.one_to_one.pk == new_one_to_one.pk
+ assert [
+ item.pk for item in instance.many_to_many.all()
+ ] == [
+ item.pk for item in new_many_to_many
+ ]
+ assert list(instance.through.all()) == []
+
+ # Representation should be correct.
+ expected = {
+ 'id': self.instance.pk,
+ 'foreign_key': new_foreign_key.pk,
+ 'one_to_one': new_one_to_one.pk,
+ 'many_to_many': [item.pk for item in new_many_to_many],
+ 'through': []
+ }
+ self.assertEqual(serializer.data, expected)