diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 5a4f04a5b..ea3bdd06e 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -185,6 +185,9 @@ class Field(object): Given and object and a field name, returns the value that should be serialized for that field. """ + if obj is None and self.default is not None: + return self.default + if obj is None: return self.empty diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 40caa1f38..764b2d31c 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 eca467ee2..d5ee3c6a7 100644 --- a/rest_framework/tests/test_serializer.py +++ b/rest_framework/tests/test_serializer.py @@ -1743,3 +1743,38 @@ class TestSerializerTransformMethods(TestCase): 'b_renamed': None, } ) +class DefaultTrueBooleanModel(models.Model): + cat = models.BooleanField(default=True) + dog = models.BooleanField(default=False) + +class SerializerDefaultTrueBoolean(TestCase): + + def setUp(self): + super(SerializerDefaultTrueBoolean, self).setUp() + + class DefaultTrueBooleanSerializer(serializers.ModelSerializer): + class Meta: + model = DefaultTrueBooleanModel + fields = ('cat', 'dog') + + self.default_true_boolean_serializer = DefaultTrueBooleanSerializer + + def test_blank_input(self): + serializer = self.default_true_boolean_serializer() + 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)