summaryrefslogtreecommitdiff
path: root/django/db/models/base.py
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-09-02 09:04:54 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-09-02 09:04:54 +0000
commitf31425e8e23621fd4329c7377c9e220f526a1c49 (patch)
tree831e9fb3f3da2e479700eca9526968a8ec8380c7 /django/db/models/base.py
parentcf5087fdb2333810ef1d1a5051e13a3d0d4c50aa (diff)
Fixed #7154 -- Inherit all model managers from abstract base classes.
Also added documentation describing how manager inheritance works (and when manager aren't inherited). Based on some patches from sebastian_noack and emulbreh. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8851 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models/base.py')
-rw-r--r--django/db/models/base.py14
1 files changed, 8 insertions, 6 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 1ea0f619b7..121626ca93 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -67,11 +67,7 @@ class ModelBase(type):
if not hasattr(meta, 'get_latest_by'):
new_class._meta.get_latest_by = base_meta.get_latest_by
- old_default_mgr = None
if getattr(new_class, '_default_manager', None):
- # We have a parent who set the default manager.
- if new_class._default_manager.model._meta.abstract:
- old_default_mgr = new_class._default_manager
new_class._default_manager = None
# Bail out early if we have already created this class.
@@ -111,6 +107,14 @@ class ModelBase(type):
% (field.name, name, base.__name__))
new_class.add_to_class(field.name, copy.deepcopy(field))
+ # Inherit managers from the abstract base classes.
+ base_managers = base._meta.abstract_managers
+ base_managers.sort()
+ for _, mgr_name, manager in base_managers:
+ val = getattr(new_class, mgr_name, None)
+ if not val or val is manager:
+ new_manager = manager._copy_to_model(new_class)
+ new_class.add_to_class(mgr_name, new_manager)
if abstract:
# Abstract base models can't be instantiated and don't appear in
# the list of models for an app. We do the final setup for them a
@@ -119,8 +123,6 @@ class ModelBase(type):
new_class.Meta = attr_meta
return new_class
- if old_default_mgr and not new_class._default_manager:
- new_class._default_manager = old_default_mgr._copy_to_model(new_class)
new_class._prepare()
register_models(new_class._meta.app_label, new_class)