diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-09-02 09:04:54 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-09-02 09:04:54 +0000 |
| commit | f31425e8e23621fd4329c7377c9e220f526a1c49 (patch) | |
| tree | 831e9fb3f3da2e479700eca9526968a8ec8380c7 /django/db/models/base.py | |
| parent | cf5087fdb2333810ef1d1a5051e13a3d0d4c50aa (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.py | 14 |
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) |
