Don't set use_for_related_fields unconditionally on all managers (ref #242).

This commit is contained in:
Jacek Tomaszewski 2014-05-06 21:59:21 +02:00
parent ee7c24641b
commit 5ed3a2696b

View file

@ -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):