mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
[1.8.x] Fixed #24291 - Fixed migration ModelState generation with unused swappable models
Swapped out models don't have a _default_manager unless they have
explicitly defined managers. ModelState.from_model() now accounts for
this case and uses an empty list for managers if no explicit managers
are defined and a model is swapped out.
Backport of 15dc8d1c9d from master
This commit is contained in:
committed by
Markus Holtermann
parent
4abadc4872
commit
84c9b24c5a
@@ -416,25 +416,28 @@ class ModelState(object):
|
||||
# instance
|
||||
managers[mgr.name] = (mgr.creation_counter, instance)
|
||||
|
||||
default_manager_name = model._default_manager.name
|
||||
# Make sure the default manager is always the first
|
||||
if model._default_manager.use_in_migrations:
|
||||
reconstruct_manager(model._default_manager)
|
||||
if hasattr(model, "_default_manager"):
|
||||
default_manager_name = model._default_manager.name
|
||||
# Make sure the default manager is always the first
|
||||
if model._default_manager.use_in_migrations:
|
||||
reconstruct_manager(model._default_manager)
|
||||
else:
|
||||
# Force this manager to be the first and thus default
|
||||
managers[default_manager_name] = (0, models.Manager())
|
||||
# Sort all managers by their creation counter
|
||||
for _, manager, _ in sorted(model._meta.managers):
|
||||
if manager.name == "_base_manager" or not manager.use_in_migrations:
|
||||
continue
|
||||
reconstruct_manager(manager)
|
||||
# Sort all managers by their creation counter but take only name and
|
||||
# instance for further processing
|
||||
managers = [
|
||||
(name, instance) for name, (cc, instance) in
|
||||
sorted(managers.items(), key=lambda v: v[1])
|
||||
]
|
||||
if managers == [(default_manager_name, models.Manager())]:
|
||||
managers = []
|
||||
else:
|
||||
# Force this manager to be the first and thus default
|
||||
managers[default_manager_name] = (0, models.Manager())
|
||||
# Sort all managers by their creation counter
|
||||
for _, manager, _ in sorted(model._meta.managers):
|
||||
if manager.name == '_base_manager' or not manager.use_in_migrations:
|
||||
continue
|
||||
reconstruct_manager(manager)
|
||||
# Sort all managers by their creation counter but take only name and
|
||||
# instance for further processing
|
||||
managers = [
|
||||
(name, instance) for name, (cc, instance) in
|
||||
sorted(managers.items(), key=lambda v: v[1])
|
||||
]
|
||||
if managers == [(default_manager_name, models.Manager())]:
|
||||
managers = []
|
||||
|
||||
# Construct the new ModelState
|
||||
|
||||
Reference in New Issue
Block a user