diff --git a/docs/api-guide/validators.md b/docs/api-guide/validators.md index 3b50442cc1..0007c718cf 100644 --- a/docs/api-guide/validators.md +++ b/docs/api-guide/validators.md @@ -189,6 +189,7 @@ A default class that can be used to *only set a default argument during create o It takes a single argument, which is the default value or callable that should be used during create operations. created_at = serializers.DateTimeField( + read_only=True, default=serializers.CreateOnlyDefault(timezone.now) ) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 110ffbfa98..3f759405f9 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -367,7 +367,8 @@ def fields(self): @cached_property def _writable_fields(self): return [ - field for field in self.fields.values() if not field.read_only + field for field in self.fields.values() + if (not field.read_only) or (field.default is not empty) ] @cached_property diff --git a/tests/test_fields.py b/tests/test_fields.py index 9a1d049797..3fe4cf8c9c 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -217,17 +217,10 @@ def example_callable(self): class TestReadOnly: def setup(self): class TestSerializer(serializers.Serializer): - read_only = serializers.ReadOnlyField(default="789") + read_only = serializers.ReadOnlyField() writable = serializers.IntegerField() self.Serializer = TestSerializer - def test_writable_fields(self): - """ - Read-only fields should not be writable, even with default () - """ - serializer = self.Serializer() - assert len(serializer._writable_fields) == 1 - def test_validate_read_only(self): """ Read-only serializers.should not be included in validation. diff --git a/tests/test_serializer.py b/tests/test_serializer.py index 0650b7c570..c44e830d0e 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -509,7 +509,7 @@ class ExampleSerializer(serializers.Serializer): class TestDefaultInclusions: def setup(self): class ExampleSerializer(serializers.Serializer): - char = serializers.CharField(default='abc') + char = serializers.CharField(read_only=True, default='abc') integer = serializers.IntegerField() self.Serializer = ExampleSerializer