aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2013-01-03 14:05:36 -0800
committerTom Christie2013-01-03 14:05:36 -0800
commit6da21fa79604ffa7dc57267effa3afb59c63e62b (patch)
tree097158438ea23789c1dbe8efed7b735fa1c26e1e
parenta122856d4610492670838298e40a2081f5ef9f75 (diff)
parent3873bc8a857829a12b2bb6a34610ab5295887660 (diff)
downloaddjango-rest-framework-6da21fa79604ffa7dc57267effa3afb59c63e62b.tar.bz2
Merge pull request #541 from yprez/default_and_partial_serializers2
Fix "default" values and partial serializers. Fixes #532.
-rw-r--r--rest_framework/fields.py4
-rw-r--r--rest_framework/tests/models.py1
-rw-r--r--rest_framework/tests/serializer.py16
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):