mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-04-28 13:03:45 +03:00
Merge pull request #541 from yprez/default_and_partial_serializers2
Fix "default" values and partial serializers. Fixes #532.
This commit is contained in:
commit
6da21fa796
|
@ -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'])
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user