aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2014-10-31 16:40:06 +0000
committerTom Christie2014-10-31 16:40:06 +0000
commit65a0d083d63d4f22a2e985a847284ad4f4a3d572 (patch)
treef0030c8c1a7e4d2f578898191ebebdafc7255ba7
parent5e1ed0aa9578be360261d5ba8b89aec959e948c8 (diff)
parent140f8620aea44daa368b244d96c68377716fac7e (diff)
downloaddjango-rest-framework-65a0d083d63d4f22a2e985a847284ad4f4a3d572.tar.bz2
Merge pull request #1963 from carljm/lazy-fields
Set up serializer fields lazily on-demand.
-rw-r--r--rest_framework/serializers.py6
-rw-r--r--tests/test_relations.py5
-rw-r--r--tests/test_serializer.py4
3 files changed, 11 insertions, 4 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index d24cb99d..7d85894f 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -22,6 +22,7 @@ from django.db import models
from django.forms import widgets
from django.utils import six
from django.utils.datastructures import SortedDict
+from django.utils.functional import cached_property
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.settings import api_settings
@@ -197,7 +198,6 @@ class BaseSerializer(WritableField):
self.init_data = data
self.init_files = files
self.object = instance
- self.fields = self.get_fields()
self._data = None
self._files = None
@@ -212,6 +212,10 @@ class BaseSerializer(WritableField):
#####
# Methods to determine which fields to use when (de)serializing objects.
+ @cached_property
+ def fields(self):
+ return self.get_fields()
+
def get_default_fields(self):
"""
Return the complete set of default fields for the object, as a dict.
diff --git a/tests/test_relations.py b/tests/test_relations.py
index bc1db69f..501a9208 100644
--- a/tests/test_relations.py
+++ b/tests/test_relations.py
@@ -102,7 +102,7 @@ class RelatedFieldSourceTests(TestCase):
self.assertEqual(value, ['BlogPost object'])
# Regression for #1129
- def test_exception_for_incorect_fk(self):
+ def test_exception_for_incorrect_fk(self):
"""
Check that the exception message are correct if the source field
doesn't exist.
@@ -123,8 +123,9 @@ class RelatedFieldSourceTests(TestCase):
(serializers.ModelSerializer,),
attrs
)
+ serializer = TestSerializer(data={'name': 'foo'})
with self.assertRaises(AttributeError):
- TestSerializer(data={'name': 'foo'})
+ serializer.fields
@unittest.skipIf(get_version() < '1.6.0', 'Upstream behaviour changed in v1.6')
diff --git a/tests/test_serializer.py b/tests/test_serializer.py
index 90f37cf2..e72b723f 100644
--- a/tests/test_serializer.py
+++ b/tests/test_serializer.py
@@ -327,7 +327,9 @@ class BasicTests(TestCase):
"""
Regression test for #652.
"""
- self.assertRaises(AssertionError, PersonSerializerInvalidReadOnly, [])
+ serializer = PersonSerializerInvalidReadOnly()
+ with self.assertRaises(AssertionError):
+ serializer.fields
def test_serializer_data_is_cleared_on_save(self):
"""