mirror of
https://github.com/Hopiu/django-modeltranslation.git
synced 2026-05-24 20:23:45 +00:00
Make all managers local for this model (ref #467)
This commit is contained in:
parent
83005dc530
commit
bbcd98d6dc
1 changed files with 3 additions and 17 deletions
|
|
@ -202,25 +202,12 @@ def add_manager(model):
|
||||||
"""
|
"""
|
||||||
if model._meta.abstract:
|
if model._meta.abstract:
|
||||||
return
|
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
|
for current_manager in model._meta.local_managers:
|
||||||
# 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:
|
|
||||||
prev_class = current_manager.__class__
|
prev_class = current_manager.__class__
|
||||||
patch_manager_class(current_manager)
|
patch_manager_class(current_manager)
|
||||||
print(" 1 patch_manager_class", current_manager)
|
|
||||||
if model._default_manager.__class__ is prev_class:
|
if model._default_manager.__class__ is prev_class:
|
||||||
# Normally model._default_manager is a reference to one of model's managers
|
# Normally model._default_manager is a reference to one of model's managers
|
||||||
# (and would be patched by the way).
|
# (and would be patched by the way).
|
||||||
|
|
@ -229,7 +216,6 @@ def add_manager(model):
|
||||||
# share the same class.
|
# share the same class.
|
||||||
model._default_manager.__class__ = current_manager.__class__
|
model._default_manager.__class__ = current_manager.__class__
|
||||||
patch_manager_class(model._base_manager)
|
patch_manager_class(model._base_manager)
|
||||||
print(" 2 patch_manager_class", model._base_manager)
|
|
||||||
model._meta.base_manager_name = 'objects'
|
model._meta.base_manager_name = 'objects'
|
||||||
model._meta._expire_cache()
|
model._meta._expire_cache()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue