diff options
| author | Tom Christie | 2014-12-19 16:02:27 +0000 |
|---|---|---|
| committer | Tom Christie | 2014-12-19 16:02:27 +0000 |
| commit | c06a82d0531f4cb290baacee196829c770913eaa (patch) | |
| tree | 08fac76df080462eab90d237362f0ba49e8d8a11 | |
| parent | 62f78dfbf1b1dfa2d6406a4be5b83bc69267e851 (diff) | |
| download | django-rest-framework-c06a82d0531f4cb290baacee196829c770913eaa.tar.bz2 | |
Model serializer caching.
| -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 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. |
