Merge pull request #541 from yprez/default_and_partial_serializers2

Fix "default" values and partial serializers.  Fixes #532.
This commit is contained in:
Tom Christie 2013-01-03 14:05:36 -08:00
commit 6da21fa796
3 changed files with 19 additions and 2 deletions

View File

@ -186,8 +186,10 @@ class WritableField(Field):
else: else:
native = data[field_name] native = data[field_name]
except KeyError: except KeyError:
if self.default is not None: if self.default is not None and not self.root.partial:
native = self.default native = self.default
# partial serializers shouldn't set the default field to avoid
# overriding the previously set value
else: else:
if self.required: if self.required:
raise ValidationError(self.error_messages['required']) raise ValidationError(self.error_messages['required'])

View File

@ -71,6 +71,7 @@ class SlugBasedModel(RESTFrameworkModel):
class DefaultValueModel(RESTFrameworkModel): class DefaultValueModel(RESTFrameworkModel):
text = models.CharField(default='foobar', max_length=100) text = models.CharField(default='foobar', max_length=100)
extra = models.CharField(blank=True, null=True, max_length=100)
class CallableDefaultValueModel(RESTFrameworkModel): class CallableDefaultValueModel(RESTFrameworkModel):

View File

@ -340,7 +340,6 @@ class ModelValidationTests(TestCase):
self.assertTrue(photo_serializer.save()) self.assertTrue(photo_serializer.save())
class RegexValidationTest(TestCase): class RegexValidationTest(TestCase):
def test_create_failed(self): def test_create_failed(self):
serializer = BookSerializer(data={'isbn': '1234567890'}) serializer = BookSerializer(data={'isbn': '1234567890'})
@ -551,6 +550,21 @@ class DefaultValueTests(TestCase):
self.assertEquals(instance.pk, 1) self.assertEquals(instance.pk, 1)
self.assertEquals(instance.text, 'overridden') 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): class CallableDefaultValueTests(TestCase):
def setUp(self): def setUp(self):