From 9fcffd78ce08d164a018105bb9417b38faaec629 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Thu, 9 May 2019 09:33:17 +0300 Subject: [PATCH] Don't cache _readable_fields and _writable_fields It might be useful for a serializer with many many fields which uses read_only and write_only on a large percentage of the fields. But the memory usage and statefulness it adds are not worth it for the common case. --- rest_framework/serializers.py | 17 ++++++++--------- tests/test_fields.py | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 7b7959db9..b23389c56 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -361,18 +361,17 @@ class Serializer(BaseSerializer, metaclass=SerializerMetaclass): fields[key] = value return fields - @cached_property + @property def _writable_fields(self): - return [ - field for field in self.fields.values() if not field.read_only - ] + for field in self.fields.values(): + if not field.read_only: + yield field - @cached_property + @property def _readable_fields(self): - return [ - field for field in self.fields.values() - if not field.write_only - ] + for field in self.fields.values(): + if not field.write_only: + yield field def get_fields(self): """ diff --git a/tests/test_fields.py b/tests/test_fields.py index e7f16c178..468b33e57 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -219,7 +219,7 @@ class TestReadOnly: Read-only fields should not be writable, even with default () """ serializer = self.Serializer() - assert len(serializer._writable_fields) == 1 + assert len(list(serializer._writable_fields)) == 1 def test_validate_read_only(self): """