diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 13b5145ba..54ad393df 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -442,7 +442,9 @@ class Field(object): try: return get_attribute(instance, self.source_attrs) except (KeyError, AttributeError) as exc: - if not self.required and self.default is empty: + if self.default is not empty: + return self.default + if not self.required: raise SkipField() msg = ( 'Got {exc_type} when attempting to get a value for field ' diff --git a/tests/test_serializer.py b/tests/test_serializer.py index 8c8b5b163..14a2184b1 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -313,6 +313,7 @@ class TestNotRequiredOutput: serializer.save() assert serializer.data == {'included': 'abc'} + @pytest.mark.skipif(True, reason='Disabling pending removal') def test_default_required_output_for_dict(self): """ 'default="something"' should require dictionary key. @@ -328,6 +329,7 @@ class TestNotRequiredOutput: with pytest.raises(KeyError): serializer.data + @pytest.mark.skipif(True, reason='Disabling pending removal') def test_default_required_output_for_object(self): """ 'default="something"' should require object attribute. @@ -345,6 +347,44 @@ class TestNotRequiredOutput: serializer.data +class TestDefaultOutput: + def setup(self): + class ExampleSerializer(serializers.Serializer): + has_default = serializers.CharField(default='abc') + no_default = serializers.CharField() + self.Serializer = ExampleSerializer + + def test_default_used_for_dict(self): + """ + 'default="something"' should be used if dictionary key is missing from input. + """ + serializer = self.Serializer({'no_default': 'def'}) + assert serializer.data == {'has_default': 'abc', 'no_default': 'def'} + + def test_default_used_for_object(self): + """ + 'default="something"' should be used if object attribute is missing from input. + """ + instance = MockObject(no_default='def') + serializer = self.Serializer(instance) + assert serializer.data == {'has_default': 'abc', 'no_default': 'def'} + + def test_default_not_used_when_in_dict(self): + """ + 'default="something"' should not be used if dictionary key is present in input. + """ + serializer = self.Serializer({'has_default': 'ghi', 'no_default': 'def'}) + assert serializer.data == {'has_default': 'ghi', 'no_default': 'def'} + + def test_default_not_used_when_in_object(self): + """ + 'default="something"' should not be used if object attribute is present in input. + """ + instance = MockObject(has_default='ghi', no_default='def') + serializer = self.Serializer(instance) + assert serializer.data == {'has_default': 'ghi', 'no_default': 'def'} + + class TestCacheSerializerData: def test_cache_serializer_data(self): """