diff --git a/modeltranslation/translator.py b/modeltranslation/translator.py index 46c60a7..fd5486e 100644 --- a/modeltranslation/translator.py +++ b/modeltranslation/translator.py @@ -161,17 +161,22 @@ def add_manager(model): """ if model._meta.abstract: return + + def patch_manager_class(manager): + if isinstance(manager, MultilingualManager): + return + if manager.__class__ is Manager: + manager.__class__ = MultilingualManager + else: + class NewMultilingualManager(MultilingualManager, manager.__class__): + use_for_related_fields = getattr( + manager.__class__, "use_for_related_fields", False) + manager.__class__ = NewMultilingualManager + for _, attname, cls in model._meta.concrete_managers + model._meta.abstract_managers: current_manager = getattr(model, attname) - if isinstance(current_manager, MultilingualManager): - continue prev_class = current_manager.__class__ - if current_manager.__class__ is Manager: - current_manager.__class__ = MultilingualManager - else: - class NewMultilingualManager(MultilingualManager, current_manager.__class__): - pass - current_manager.__class__ = NewMultilingualManager + 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). @@ -179,6 +184,7 @@ def add_manager(model): # model._default_manager is not the same instance as one of managers, but it # share the same class. model._default_manager.__class__ = current_manager.__class__ + patch_manager_class(model._base_manager) def patch_constructor(model):