diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 49eec8259..6c9ec1766 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -488,6 +488,7 @@ class Serializer(BaseSerializer, metaclass=SerializerMetaclass): if errors: raise ValidationError(errors) + ret.update(self._read_only_defaults()) return ret def to_representation(self, instance): diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 7da1b41ae..3473b950f 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -1333,3 +1333,18 @@ class Issue6751Test(TestCase): serializer.save() self.assertEqual(instance.char_field, 'value changed by signal') + + +class TestReadonlyDefault(TestCase): + def test_readonly_default(self): + class TestSerializer(serializers.ModelSerializer): + char_field = serializers.CharField(read_only=True, default='default') + + class Meta: + model = OneFieldModel + fields = ('char_field',) + + serializer = TestSerializer(data={}) + serializer.is_valid() + instance = serializer.save() + assert instance.char_field == 'default' diff --git a/tests/test_serializer_nested.py b/tests/test_serializer_nested.py index 09ac37f24..45fd74734 100644 --- a/tests/test_serializer_nested.py +++ b/tests/test_serializer_nested.py @@ -306,6 +306,35 @@ class TestNestedWriteErrors(TestCase): ) +class TestNestedWriteReadonlyDefault(TestCase): + def test_nested_serializer_readonly_default(self): + profile_obj = NestedWriteProfile.objects.create(address='52 festive road') + + class ProfileSerializer(serializers.ModelSerializer): + class Meta: + model = NestedWriteProfile + fields = ['address'] + + class NestedProfileSerializer(serializers.ModelSerializer): + profile = ProfileSerializer(read_only=True, default=lambda: profile_obj) + + class Meta: + model = NestedWritePerson + fields = ['profile'] + + serializer = NestedProfileSerializer(data={}) + assert serializer.is_valid() + assert serializer.validated_data == {'profile': profile_obj} + nested = serializer.save() + assert nested.profile == profile_obj + + serializer = NestedProfileSerializer(data={'profile': {'address': '123 fake street'}}) + assert serializer.is_valid() + assert serializer.validated_data == {'profile': profile_obj} + serializer.save() + assert nested.profile == profile_obj + + if postgres_fields: class NonRelationalPersonModel(models.Model): """Model declaring a postgres JSONField"""