mirror of
https://github.com/django/django.git
synced 2025-04-26 02:04:38 +00:00
Refs #27666 -- Added ProjectState.reload_models().
This commit is contained in:
parent
45ded053b1
commit
46e0335583
@ -306,6 +306,7 @@ class RenameModel(ModelOperation):
|
||||
# Repoint all fields pointing to the old model to the new one.
|
||||
old_model_tuple = app_label, self.old_name_lower
|
||||
new_remote_model = '%s.%s' % (app_label, self.new_name)
|
||||
to_reload = []
|
||||
for (model_app_label, model_name), model_state in state.models.items():
|
||||
model_changed = False
|
||||
for index, (name, field) in enumerate(model_state.fields):
|
||||
@ -331,7 +332,9 @@ class RenameModel(ModelOperation):
|
||||
model_state.fields[index] = name, changed_field
|
||||
model_changed = True
|
||||
if model_changed:
|
||||
state.reload_model(model_app_label, model_name, delay=True)
|
||||
to_reload.append((model_app_label, model_name))
|
||||
# Reload models related to old model before removing the old model.
|
||||
state.reload_models(to_reload, delay=True)
|
||||
# Remove the old model.
|
||||
state.remove_model(app_label, self.old_name_lower)
|
||||
state.reload_model(app_label, self.new_name_lower, delay=True)
|
||||
|
@ -112,15 +112,16 @@ class ProjectState(object):
|
||||
# the cache automatically (#24513)
|
||||
self.apps.clear_cache()
|
||||
|
||||
def reload_model(self, app_label, model_name, delay=False):
|
||||
def _find_reload_model(self, app_label, model_name, delay=False):
|
||||
if delay:
|
||||
self.is_delayed = True
|
||||
|
||||
if 'apps' in self.__dict__: # hasattr would cache the property
|
||||
related_models = set()
|
||||
|
||||
try:
|
||||
old_model = self.apps.get_model(app_label, model_name)
|
||||
except LookupError:
|
||||
related_models = set()
|
||||
pass
|
||||
else:
|
||||
# Get all relations to and from the old model before reloading,
|
||||
# as _meta.apps may change
|
||||
@ -157,6 +158,21 @@ class ProjectState(object):
|
||||
# Include the model itself
|
||||
related_models.add((app_label, model_name))
|
||||
|
||||
return related_models
|
||||
|
||||
def reload_model(self, app_label, model_name, delay=False):
|
||||
if 'apps' in self.__dict__: # hasattr would cache the property
|
||||
related_models = self._find_reload_model(app_label, model_name, delay)
|
||||
self._reload(related_models)
|
||||
|
||||
def reload_models(self, models, delay=True):
|
||||
if 'apps' in self.__dict__: # hasattr would cache the property
|
||||
related_models = set()
|
||||
for app_label, model_name in models:
|
||||
related_models.update(self._find_reload_model(app_label, model_name, delay))
|
||||
self._reload(related_models)
|
||||
|
||||
def _reload(self, related_models):
|
||||
# Unregister all related models
|
||||
with self.apps.bulk_update():
|
||||
for rel_app_label, rel_model_name in related_models:
|
||||
|
Loading…
x
Reference in New Issue
Block a user