diff --git a/docs/api-guide/validators.md b/docs/api-guide/validators.md index fe492c0a7..fd1e221bd 100644 --- a/docs/api-guide/validators.md +++ b/docs/api-guide/validators.md @@ -189,7 +189,6 @@ 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 e35e04440..d773902e8 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -367,8 +367,7 @@ class Serializer(BaseSerializer): @cached_property def _writable_fields(self): return [ - field for field in self.fields.values() - if (not field.read_only) or (field.default is not empty) + field for field in self.fields.values() if not field.read_only ] @cached_property diff --git a/tests/test_fields.py b/tests/test_fields.py index 6a694092a..eee794eaa 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -219,10 +219,17 @@ class TestSource: class TestReadOnly: def setup(self): class TestSerializer(serializers.Serializer): - read_only = serializers.ReadOnlyField() + read_only = serializers.ReadOnlyField(default="789") 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 120632572..c37998f19 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -513,7 +513,7 @@ class TestCacheSerializerData: class TestDefaultInclusions: def setup(self): class ExampleSerializer(serializers.Serializer): - char = serializers.CharField(read_only=True, default='abc') + char = serializers.CharField(default='abc') integer = serializers.IntegerField() self.Serializer = ExampleSerializer