diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 163abf4f0..325b73b4a 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -323,6 +323,8 @@ class BaseSerializer(WritableField): field.initialize(parent=self, field_name=field_name) key = self.get_field_key(field_name) value = field.field_to_native(obj, field_name) + if value == None and hasattr(field, 'default'): + value = field.default method = getattr(self, 'transform_%s' % field_name, None) if callable(method): value = method(obj, value) diff --git a/rest_framework/tests/test_serializer.py b/rest_framework/tests/test_serializer.py index 1d621aa2f..6cd3093f3 100644 --- a/rest_framework/tests/test_serializer.py +++ b/rest_framework/tests/test_serializer.py @@ -1722,7 +1722,7 @@ class TestSerializerTransformMethods(TestCase): ) class DefaultTrueBooleanModel(models.Model): cat = models.BooleanField(default=True) - dog = models.BooleanField(default=True) + dog = models.BooleanField(default=False) class SerializerDefaultTrueBoolean(TestCase): @@ -1738,18 +1738,20 @@ class SerializerDefaultTrueBoolean(TestCase): def test_blank_input(self): serializer = self.default_true_boolean_serializer() - self.assertEqual(serializer.data['dog'], True) self.assertEqual(serializer.data['cat'], True) - - + self.assertEqual(serializer.data['dog'], False) def test_enabled_as_false(self): serializer = self.default_true_boolean_serializer({'cat': False, 'dog': False}) self.assertEqual(serializer.data['cat'], False) self.assertEqual(serializer.data['dog'], False) - def test_enabled_as_true(self): serializer = self.default_true_boolean_serializer({'cat': True, 'dog': True}) self.assertEqual(serializer.data['cat'], True) self.assertEqual(serializer.data['dog'], True) + + def test_enabled_partial(self): + serializer = self.default_true_boolean_serializer({'cat': False}) + self.assertEqual(serializer.data['cat'], False) + self.assertEqual(serializer.data['dog'], False)