summaryrefslogtreecommitdiff
path: root/django/db/models/loading.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/db/models/loading.py')
-rw-r--r--django/db/models/loading.py36
1 files changed, 35 insertions, 1 deletions
diff --git a/django/db/models/loading.py b/django/db/models/loading.py
index e07aab4efe..96ebe43941 100644
--- a/django/db/models/loading.py
+++ b/django/db/models/loading.py
@@ -10,7 +10,7 @@ import os
import threading
__all__ = ('get_apps', 'get_app', 'get_models', 'get_model', 'register_models',
- 'load_app', 'app_cache_ready')
+ 'load_app', 'app_cache_ready', 'remove_model')
class AppCache(object):
"""
@@ -178,6 +178,39 @@ class AppCache(object):
continue
model_dict[model_name] = model
+ def clear_apps(self):
+ """Clears cache so on next call, it will be reloaded."""
+ self.loaded = False
+ self.write_lock.acquire()
+ self.handled.clear()
+ try:
+ if self.loaded:
+ return
+ for app_name in settings.INSTALLED_APPS:
+ if app_name in self.handled:
+ continue
+ self.load_app(app_name, True)
+ if not self.nesting_level:
+ for app_name in self.postponed:
+ self.load_app(app_name)
+ self.loaded = True
+ finally:
+ self.write_lock.release()
+
+ def remove_model(self, model_name):
+ """Removes a model from the cache. Used when loading test-only models."""
+ try:
+ try:
+ self.write_lock.acquire()
+ if model_name in self.app_models:
+ del self.app_models[model_name]
+ except Exception, e:
+ raise e
+ finally:
+ self.write_lock.release()
+
+
+
cache = AppCache()
# These methods were always module level, so are kept that way for backwards
@@ -190,3 +223,4 @@ get_model = cache.get_model
register_models = cache.register_models
load_app = cache.load_app
app_cache_ready = cache.app_cache_ready
+remove_model = cache.remove_model \ No newline at end of file