From a2af2420ce8f4f2bf67e095740e62fa2d3c249cf Mon Sep 17 00:00:00 2001 From: Loïc Bistuer Date: Sat, 9 Jul 2016 17:52:52 +0700 Subject: [1.10.x] Fixed #26881 -- Fixed duplicate managers in migrations. When both parent and child models had managers with the same name and a migrations opt-in both were added to the migration state. Backport of dab83e5ba108c08a04ae400ac5354fd73e26c6f5 from master --- django/db/migrations/state.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'django') diff --git a/django/db/migrations/state.py b/django/db/migrations/state.py index 44eab227ed..7cfdd6cd99 100644 --- a/django/db/migrations/state.py +++ b/django/db/migrations/state.py @@ -446,12 +446,19 @@ class ModelState(object): bases = (models.Model,) managers = [] + manager_names = set() default_manager_shim = None for manager in model._meta.managers: - if manager.use_in_migrations: + manager_name = force_text(manager.name) + if manager_name in manager_names: + # Skip overridden managers. + continue + elif manager.use_in_migrations: + # Copy managers usable in migrations. new_manager = copy.copy(manager) new_manager._set_creation_counter() elif manager is model._base_manager or manager is model._default_manager: + # Shim custom managers used as default and base managers. new_manager = models.Manager() new_manager.model = manager.model new_manager.name = manager.name @@ -459,7 +466,8 @@ class ModelState(object): default_manager_shim = new_manager else: continue - managers.append((force_text(manager.name), new_manager)) + manager_names.add(manager_name) + managers.append((manager_name, new_manager)) # Ignore a shimmed default manager called objects if it's the only one. if managers == [('objects', default_manager_shim)]: -- cgit v1.3