aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2014-12-19 16:02:27 +0000
committerTom Christie2014-12-19 16:02:27 +0000
commitc06a82d0531f4cb290baacee196829c770913eaa (patch)
tree08fac76df080462eab90d237362f0ba49e8d8a11
parent62f78dfbf1b1dfa2d6406a4be5b83bc69267e851 (diff)
downloaddjango-rest-framework-c06a82d0531f4cb290baacee196829c770913eaa.tar.bz2
Model serializer caching.
-rw-r--r--rest_framework/serializers.py22
1 files changed, 21 insertions, 1 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 8adbafe4..7b7170da 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -682,6 +682,10 @@ def raise_errors_on_nested_writes(method_name, serializer, validated_data):
)
+MODEL_SERIALIZER_FIELDS_CACHE = {}
+MODEL_SERIALIZER_VALIDATORS_CACHE = {}
+
+
class ModelSerializer(Serializer):
"""
A `ModelSerializer` is just a regular `Serializer`, except that:
@@ -802,6 +806,11 @@ class ModelSerializer(Serializer):
Return the dict of field names -> field instances that should be
used for `self.fields` when instantiating the serializer.
"""
+ cls = self.__class__
+
+ if cls in MODEL_SERIALIZER_FIELDS_CACHE:
+ return copy.deepcopy(MODEL_SERIALIZER_FIELDS_CACHE[cls])
+
declared_fields = copy.deepcopy(self._declared_fields)
model = getattr(self.Meta, 'model')
depth = getattr(self.Meta, 'depth', 0)
@@ -837,6 +846,8 @@ class ModelSerializer(Serializer):
# Add in any hidden fields.
ret.update(hidden_fields)
+ MODEL_SERIALIZER_FIELDS_CACHE[cls] = ret
+
return ret
# Methods for determining the set of field names to include...
@@ -1217,12 +1228,21 @@ class ModelSerializer(Serializer):
if validators is not None:
return validators[:]
+ cls = self.__class__
+
+ if cls in MODEL_SERIALIZER_VALIDATORS_CACHE:
+ return MODEL_SERIALIZER_VALIDATORS_CACHE[cls][:]
+
# Otherwise use the default set of validators.
- return (
+ validators = (
self.get_unique_together_validators() +
self.get_unique_for_date_validators()
)
+ MODEL_SERIALIZER_VALIDATORS_CACHE[cls] = validators
+
+ return validators
+
def get_unique_together_validators(self):
"""
Determine a default set of validators for any unique_together contraints.