From 849136a68493539f7e92877232ef50e793db7ce9 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 6353c71bd..107115a2f 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -361,18 +361,17 @@ class Serializer(BaseSerializer, metaclass=SerializerMetaclass): field.bind(field_name=field_name, parent=self) 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 41d08bd5e..6a6d88d03 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): """