diff options
| author | Loïc Bistuer <loic.bistuer@gmail.com> | 2016-07-09 17:52:52 +0700 |
|---|---|---|
| committer | Loïc Bistuer <loic.bistuer@gmail.com> | 2016-07-09 18:12:18 +0700 |
| commit | a2af2420ce8f4f2bf67e095740e62fa2d3c249cf (patch) | |
| tree | bbfe2f06674a3235d007da98e62a0699931a2249 /django/db | |
| parent | cf6f0e9978af750855d61fcee42ffc75c62c81f9 (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.py | 12 |
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)]: |
