Skip to content

Commit 140f862

Browse files
committed
Set up serializer fields lazily on-demand.
This avoids AppRegistryNotReady problems in Django 1.7 with nested serializers, which are instantiated at import time, possibly before Django's app registry is fully populated.
1 parent 34a7a48 commit 140f862

File tree

3 files changed

+11
-4
lines changed

3 files changed

+11
-4
lines changed

rest_framework/serializers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from django.forms import widgets
2323
from django.utils import six
2424
from django.utils.datastructures import SortedDict
25+
from django.utils.functional import cached_property
2526
from django.core.exceptions import ObjectDoesNotExist
2627
from rest_framework.settings import api_settings
2728

@@ -197,7 +198,6 @@ def __init__(self, instance=None, data=None, files=None,
197198
self.init_data = data
198199
self.init_files = files
199200
self.object = instance
200-
self.fields = self.get_fields()
201201

202202
self._data = None
203203
self._files = None
@@ -212,6 +212,10 @@ def __init__(self, instance=None, data=None, files=None,
212212
#####
213213
# Methods to determine which fields to use when (de)serializing objects.
214214

215+
@cached_property
216+
def fields(self):
217+
return self.get_fields()
218+
215219
def get_default_fields(self):
216220
"""
217221
Return the complete set of default fields for the object, as a dict.

tests/test_relations.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class ClassWithQuerysetMethod(object):
102102
self.assertEqual(value, ['BlogPost object'])
103103

104104
# Regression for #1129
105-
def test_exception_for_incorect_fk(self):
105+
def test_exception_for_incorrect_fk(self):
106106
"""
107107
Check that the exception message are correct if the source field
108108
doesn't exist.
@@ -123,8 +123,9 @@ class Meta:
123123
(serializers.ModelSerializer,),
124124
attrs
125125
)
126+
serializer = TestSerializer(data={'name': 'foo'})
126127
with self.assertRaises(AttributeError):
127-
TestSerializer(data={'name': 'foo'})
128+
serializer.fields
128129

129130

130131
@unittest.skipIf(get_version() < '1.6.0', 'Upstream behaviour changed in v1.6')

tests/test_serializer.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,9 @@ def test_invalid_read_only_fields(self):
327327
"""
328328
Regression test for #652.
329329
"""
330-
self.assertRaises(AssertionError, PersonSerializerInvalidReadOnly, [])
330+
serializer = PersonSerializerInvalidReadOnly()
331+
with self.assertRaises(AssertionError):
332+
serializer.fields
331333

332334
def test_serializer_data_is_cleared_on_save(self):
333335
"""

0 commit comments

Comments
 (0)