From 36e1987f598a5a21a788e931c1ecb13e4c0d0ad8 Mon Sep 17 00:00:00 2001 From: Yuri Prezument Date: Tue, 25 Dec 2012 18:50:00 +0200 Subject: [PATCH 1/3] Regression test for #532 - values overriden by "default" setting --- rest_framework/tests/models.py | 1 + rest_framework/tests/serializer.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/rest_framework/tests/models.py b/rest_framework/tests/models.py index 0759650ab..ae8e42b8f 100644 --- a/rest_framework/tests/models.py +++ b/rest_framework/tests/models.py @@ -71,6 +71,7 @@ class SlugBasedModel(RESTFrameworkModel): class DefaultValueModel(RESTFrameworkModel): text = models.CharField(default='foobar', max_length=100) + extra = models.CharField(blank=True, null=True, max_length=100) class CallableDefaultValueModel(RESTFrameworkModel): diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py index f780e811e..aac1f68a2 100644 --- a/rest_framework/tests/serializer.py +++ b/rest_framework/tests/serializer.py @@ -340,7 +340,6 @@ class ModelValidationTests(TestCase): self.assertTrue(photo_serializer.save()) - class RegexValidationTest(TestCase): def test_create_failed(self): serializer = BookSerializer(data={'isbn': '1234567890'}) @@ -551,6 +550,21 @@ class DefaultValueTests(TestCase): self.assertEquals(instance.pk, 1) self.assertEquals(instance.text, 'overridden') + def test_partial_update_default(self): + """ Regression test for issue #532 """ + data = {'text': 'overridden'} + serializer = self.serializer_class(data=data, partial=True) + self.assertEquals(serializer.is_valid(), True) + instance = serializer.save() + + data = {'extra': 'extra_value'} + serializer = self.serializer_class(instance=instance, data=data, partial=True) + self.assertEquals(serializer.is_valid(), True) + instance = serializer.save() + + self.assertEquals(instance.extra, 'extra_value') + self.assertEquals(instance.text, 'overridden') + class CallableDefaultValueTests(TestCase): def setUp(self): From 6b962cfcf78b24a57cea43f1592df1dcf2646c12 Mon Sep 17 00:00:00 2001 From: Yuri Prezument Date: Sun, 30 Dec 2012 10:58:54 +0200 Subject: [PATCH 2/3] Fix "default" and partial serializers, fixes #532 --- rest_framework/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index dd90c3f86..47bdc26aa 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -189,7 +189,7 @@ class WritableField(Field): else: native = data[field_name] except KeyError: - if self.default is not None: + if self.default is not None and not self.root.partial: native = self.default else: if self.required: From 3873bc8a857829a12b2bb6a34610ab5295887660 Mon Sep 17 00:00:00 2001 From: Yuri Prezument Date: Wed, 2 Jan 2013 15:55:35 +0200 Subject: [PATCH 3/3] Add explaining comment --- rest_framework/fields.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 47bdc26aa..5ae8ff485 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -191,6 +191,8 @@ class WritableField(Field): except KeyError: if self.default is not None and not self.root.partial: native = self.default + # partial serializers shouldn't set the default field to avoid + # overriding the previously set value else: if self.required: raise ValidationError(self.error_messages['required'])