Skip to content

Commit

Permalink
Fixed #12389 - performance enhancement of get_models()
Browse files Browse the repository at this point in the history
Thanks to Travis Cline for the patch, which gives about 35% speed increase
for the testsuite (with SQLite in-memory DB).



git-svn-id: http://code.djangoproject.com/svn/django/trunk@11883 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
spookylukey committed Dec 16, 2009
1 parent c90b15e commit b38e678
Showing 1 changed file with 9 additions and 1 deletion.
10 changes: 9 additions & 1 deletion django/db/models/loading.py
Expand Up @@ -35,6 +35,7 @@ class AppCache(object):
postponed = [],
nesting_level = 0,
write_lock = threading.RLock(),
_get_models_cache = {},
)

def __init__(self):
Expand Down Expand Up @@ -140,6 +141,11 @@ def get_models(self, app_mod=None, include_auto_created=False):
explicit intermediate table) are not included. However, if you
specify include_auto_created=True, they will be.
"""
cache_key = (app_mod, include_auto_created)
try:
return self._get_models_cache[cache_key]
except KeyError:
pass
self._populate()
if app_mod:
model_list = self.app_models.get(app_mod.__name__.split('.')[-2], SortedDict()).values()
Expand All @@ -148,7 +154,8 @@ def get_models(self, app_mod=None, include_auto_created=False):
for app_entry in self.app_models.itervalues():
model_list.extend(app_entry.values())
if not include_auto_created:
return filter(lambda o: not o._meta.auto_created, model_list)
model_list = filter(lambda o: not o._meta.auto_created, model_list)
self._get_models_cache[cache_key] = model_list
return model_list

def get_model(self, app_label, model_name, seed_cache=True):
Expand Down Expand Up @@ -183,6 +190,7 @@ def register_models(self, app_label, *models):
if os.path.splitext(fname1)[0] == os.path.splitext(fname2)[0]:
continue
model_dict[model_name] = model
self._get_models_cache.clear()

cache = AppCache()

Expand Down

0 comments on commit b38e678

Please sign in to comment.