summaryrefslogtreecommitdiff
path: root/django/db
diff options
context:
space:
mode:
authorLoïc Bistuer <loic.bistuer@gmail.com>2016-07-09 17:52:52 +0700
committerLoïc Bistuer <loic.bistuer@gmail.com>2016-07-09 18:12:18 +0700
commita2af2420ce8f4f2bf67e095740e62fa2d3c249cf (patch)
treebbfe2f06674a3235d007da98e62a0699931a2249 /django/db
parentcf6f0e9978af750855d61fcee42ffc75c62c81f9 (diff)
[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
Diffstat (limited to 'django/db')
-rw-r--r--django/db/migrations/state.py12
1 files changed, 10 insertions, 2 deletions
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)]: