diff options
| author | Markus Holtermann <info@markusholtermann.eu> | 2015-08-22 23:40:34 +1000 |
|---|---|---|
| committer | Markus Holtermann <info@markusholtermann.eu> | 2015-08-27 17:06:21 +1000 |
| commit | e1427cc609fa6ab247501b101cfb3c0092aba55b (patch) | |
| tree | cd3a323b08fcb8301b267ce5aa784da41d2339e2 /django/apps | |
| parent | 91f701f4fc324cd2feb7dbf151338a358ca0ea18 (diff) | |
Fixed #24590 -- Cached calls to swappable_setting.
Moved the lookup in Field.swappable_setting to Apps, and added
an lru_cache to cache the results.
Refs #24743
Thanks Marten Kenbeek for the initial work on the patch. Thanks Aymeric
Augustin and Tim Graham for the review.
Diffstat (limited to 'django/apps')
| -rw-r--r-- | django/apps/registry.py | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/django/apps/registry.py b/django/apps/registry.py index 269787545d..46c10ef4fb 100644 --- a/django/apps/registry.py +++ b/django/apps/registry.py @@ -260,6 +260,28 @@ class Apps(object): "Model '%s.%s' not registered." % (app_label, model_name)) return model + @lru_cache.lru_cache(maxsize=None) + def get_swappable_settings_name(self, to_string): + """ + For a given model string (e.g. "auth.User"), return the name of the + corresponding settings name if it refers to a swappable model. If the + referred model is not swappable, return None. + + This method is decorated with lru_cache because it's performance + critical when it comes to migrations. Since the swappable settings don't + change after Django has loaded the settings, there is no reason to get + the respective settings attribute over and over again. + """ + for model in self.get_models(include_swapped=True): + swapped = model._meta.swapped + # Is this model swapped out for the model given by to_string? + if swapped and swapped == to_string: + return model._meta.swappable + # Is this model swappable and the one given by to_string? + if model._meta.swappable and model._meta.label == to_string: + return model._meta.swappable + return None + def set_available_apps(self, available): """ Restricts the set of installed apps used by get_app_config[s]. |
