Always exclude read_only fields from _writable_fields

This commit is contained in:
Carlton Gibson 2018-03-16 15:53:57 +01:00
parent 247cf096d4
commit d64e88e467
3 changed files with 10 additions and 4 deletions

View File

@ -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

View File

@ -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.

View File

@ -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