Django

Code

Changeset 7339

Show
Ignore:
Timestamp:
03/20/08 11:10:51 (8 months ago)
Author:
mtredinnick
Message:

queyrset-refactor: Allow default managers to be inherited from an abstract base
class, unless the child class defines its own manager (i.e. child has first
chance to define the default). All managers were already inherited. This just
changes how the default is set in the case when the child defines no manager
and an abstract parent does.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/queryset-refactor/django/db/models/base.py

    r7249 r7339  
    44from itertools import izip 
    55 
    6 import django.db.models.manipulators 
    7 import django.db.models.manager 
     6import django.db.models.manipulators    # Imported to register signal handler. 
     7import django.db.models.manager         # Ditto. 
    88from django.core import validators 
    99from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, FieldError 
     
    6060                    new_class._meta.get_latest_by = base_meta.get_latest_by 
    6161 
    62         if getattr(new_class, '_default_manager', None) is not None: 
    63             # We have a parent who set the default manager. We need to override 
    64             # this. 
     62        old_default_mgr = None 
     63        if getattr(new_class, '_default_manager', None): 
     64            # We have a parent who set the default manager. 
     65            if new_class._default_manager.model._meta.abstract: 
     66                old_default_mgr = new_class._default_manager 
    6567            new_class._default_manager = None 
    6668        if getattr(new_class._meta, 'app_label', None) is None: 
     
    114116            return new_class 
    115117 
     118        if old_default_mgr and not new_class._default_manager: 
     119            new_class._default_manager = old_default_mgr._copy_to_model(new_class) 
    116120        new_class._prepare() 
    117121        register_models(new_class._meta.app_label, new_class) 
  • django/branches/queryset-refactor/django/db/models/manager.py

    r7249 r7339  
     1import copy 
     2 
    13from django.db.models.query import QuerySet, EmptyQuerySet, insert_query 
    24from django.dispatch import dispatcher 
     
    68def ensure_default_manager(sender): 
    79    cls = sender 
    8     if not hasattr(cls, '_default_manager') or cls._default_manager is None
     10    if not getattr(cls, '_default_manager', None) and not cls._meta.abstract
    911        # Create the default manager, if needed. 
    1012        try: 
     
    3234        self.model = model 
    3335        setattr(model, name, ManagerDescriptor(self)) 
    34         if not hasattr(model, '_default_manager') or model._default_manager is None or self.creation_counter < model._default_manager.creation_counter: 
     36        if not getattr(model, '_default_manager', None) or self.creation_counter < model._default_manager.creation_counter: 
    3537            model._default_manager = self 
     38 
     39    def _copy_to_model(self, model): 
     40        """ 
     41        Makes a copy of the manager and assigns it to 'model', which should be 
     42        a child of the existing model (used when inheriting a manager from an 
     43        abstract base class). 
     44        """ 
     45        assert issubclass(model, self.model) 
     46        mgr = copy.copy(self) 
     47        mgr.model = model 
     48        return mgr 
    3649 
    3750    #######################