Skip to content

Commit c2b24f8

Browse files
Alter read_only+default behaviour (encode#5886)
* Always exclude read_only fields from _writable_fields * Remove `read_only` from `CreateOnlyDefault` example. In this context (without mentioning `save`) now slightly misleading.
1 parent 12569f8 commit c2b24f8

File tree

4 files changed

+10
-5
lines changed

4 files changed

+10
-5
lines changed

docs/api-guide/validators.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,6 @@ A default class that can be used to *only set a default argument during create o
189189
It takes a single argument, which is the default value or callable that should be used during create operations.
190190

191191
created_at = serializers.DateTimeField(
192-
read_only=True,
193192
default=serializers.CreateOnlyDefault(timezone.now)
194193
)
195194

rest_framework/serializers.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,8 +367,7 @@ def fields(self):
367367
@cached_property
368368
def _writable_fields(self):
369369
return [
370-
field for field in self.fields.values()
371-
if (not field.read_only) or (field.default is not empty)
370+
field for field in self.fields.values() if not field.read_only
372371
]
373372

374373
@cached_property

tests/test_fields.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,17 @@ def example_callable(self):
219219
class TestReadOnly:
220220
def setup(self):
221221
class TestSerializer(serializers.Serializer):
222-
read_only = serializers.ReadOnlyField()
222+
read_only = serializers.ReadOnlyField(default="789")
223223
writable = serializers.IntegerField()
224224
self.Serializer = TestSerializer
225225

226+
def test_writable_fields(self):
227+
"""
228+
Read-only fields should not be writable, even with default ()
229+
"""
230+
serializer = self.Serializer()
231+
assert len(serializer._writable_fields) == 1
232+
226233
def test_validate_read_only(self):
227234
"""
228235
Read-only serializers.should not be included in validation.

tests/test_serializer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ class ExampleSerializer(serializers.Serializer):
513513
class TestDefaultInclusions:
514514
def setup(self):
515515
class ExampleSerializer(serializers.Serializer):
516-
char = serializers.CharField(read_only=True, default='abc')
516+
char = serializers.CharField(default='abc')
517517
integer = serializers.IntegerField()
518518
self.Serializer = ExampleSerializer
519519

0 commit comments

Comments
 (0)