diff options
| -rw-r--r-- | rest_framework/serializers.py | 22 |
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. |
