aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 18b810df..aa7795b0 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -688,6 +688,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:
@@ -808,6 +812,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])
+
assert hasattr(self, 'Meta'), (
'Class {serializer_class} missing "Meta" attribute'.format(
serializer_class=self.__class__.__name__
@@ -863,6 +872,8 @@ class ModelSerializer(Serializer):
# Add in any hidden fields.
fields.update(hidden_fields)
+ MODEL_SERIALIZER_FIELDS_CACHE[cls] = fields
+
return fields
# Methods for determining the set of field names to include...
@@ -1260,12 +1271,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.