NOT_PROVIDED = object() class FieldCacheMixin: """Provide an API for working with the model's fields value cache.""" def get_cache_name(self): raise NotImplementedError def get_cached_value(self, instance, default=NOT_PROVIDED): cache_name = self.get_cache_name() try: return instance._state.fields_cache[cache_name] except KeyError: if default is NOT_PROVIDED: raise return default def is_cached(self, instance): return self.get_cache_name() in instance._state.fields_cache def set_cached_value(self, instance, value): instance._state.fields_cache[self.get_cache_name()] = value def delete_cached_value(self, instance): del instance._state.fields_cache[self.get_cache_name()]