From bbcd98d6dca77e207cacdfc76116fe0ebc17f4bc Mon Sep 17 00:00:00 2001 From: Sergey Tereschenko Date: Sun, 17 Feb 2019 22:19:06 +0200 Subject: [PATCH] Make all managers local for this model (ref #467) --- modeltranslation/translator.py | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/modeltranslation/translator.py b/modeltranslation/translator.py index 7897f5a..744ceed 100644 --- a/modeltranslation/translator.py +++ b/modeltranslation/translator.py @@ -202,25 +202,12 @@ def add_manager(model): """ if model._meta.abstract: return + # Make all managers local for this model to fix patching parent model managers + model._meta.local_managers = model._meta.managers - # Inspired by django.db.models.options.Options.managers (find all - # managers by following the normal Python MRO rules), but keeps the - # original managers instead of making copies. - managers = [] - seen = set() - bases = [b for b in model.mro() if hasattr(b, '_meta')] - print("add_manager %s\n bases: %s" % (model._meta.label, bases)) - for base in bases: - for manager in base._meta.local_managers: - if manager.name in seen: - continue - managers.append(manager) - seen.add(manager.name) - - for current_manager in managers: + for current_manager in model._meta.local_managers: prev_class = current_manager.__class__ patch_manager_class(current_manager) - print(" 1 patch_manager_class", current_manager) if model._default_manager.__class__ is prev_class: # Normally model._default_manager is a reference to one of model's managers # (and would be patched by the way). @@ -229,7 +216,6 @@ def add_manager(model): # share the same class. model._default_manager.__class__ = current_manager.__class__ patch_manager_class(model._base_manager) - print(" 2 patch_manager_class", model._base_manager) model._meta.base_manager_name = 'objects' model._meta._expire_cache()