diff options
| -rw-r--r-- | rest_framework/fields.py | 4 | ||||
| -rw-r--r-- | rest_framework/tests/models.py | 1 | ||||
| -rw-r--r-- | rest_framework/tests/serializer.py | 16 | 
3 files changed, 19 insertions, 2 deletions
| diff --git a/rest_framework/fields.py b/rest_framework/fields.py index a022fe09..c406a2f3 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -186,8 +186,10 @@ 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 +                # 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']) diff --git a/rest_framework/tests/models.py b/rest_framework/tests/models.py index 54fa2dec..59c35074 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 701b2f47..8767385e 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): | 
