web/lib/django/db/models/manager.py
changeset 29 cc9b7e14412b
parent 0 0d40e90630ef
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
     1 import copy
     1 from django.utils import copycompat as copy
     2 
     2 from django.conf import settings
     3 from django.db.models.query import QuerySet, EmptyQuerySet, insert_query
     3 from django.db import router
       
     4 from django.db.models.query import QuerySet, EmptyQuerySet, insert_query, RawQuerySet
     4 from django.db.models import signals
     5 from django.db.models import signals
     5 from django.db.models.fields import FieldDoesNotExist
     6 from django.db.models.fields import FieldDoesNotExist
       
     7 
     6 
     8 
     7 def ensure_default_manager(sender, **kwargs):
     9 def ensure_default_manager(sender, **kwargs):
     8     """
    10     """
     9     Ensures that a Model subclass contains a default manager  and sets the
    11     Ensures that a Model subclass contains a default manager  and sets the
    10     _default_manager attribute on the class. Also sets up the _base_manager
    12     _default_manager attribute on the class. Also sets up the _base_manager
    16         return
    18         return
    17     if not getattr(cls, '_default_manager', None):
    19     if not getattr(cls, '_default_manager', None):
    18         # Create the default manager, if needed.
    20         # Create the default manager, if needed.
    19         try:
    21         try:
    20             cls._meta.get_field('objects')
    22             cls._meta.get_field('objects')
    21             raise ValueError, "Model %s must specify a custom Manager, because it has a field named 'objects'" % cls.__name__
    23             raise ValueError("Model %s must specify a custom Manager, because it has a field named 'objects'" % cls.__name__)
    22         except FieldDoesNotExist:
    24         except FieldDoesNotExist:
    23             pass
    25             pass
    24         cls.add_to_class('objects', Manager())
    26         cls.add_to_class('objects', Manager())
    25         cls._base_manager = cls.objects
    27         cls._base_manager = cls.objects
    26     elif not getattr(cls, '_base_manager', None):
    28     elif not getattr(cls, '_base_manager', None):
    48     def __init__(self):
    50     def __init__(self):
    49         super(Manager, self).__init__()
    51         super(Manager, self).__init__()
    50         self._set_creation_counter()
    52         self._set_creation_counter()
    51         self.model = None
    53         self.model = None
    52         self._inherited = False
    54         self._inherited = False
       
    55         self._db = None
    53 
    56 
    54     def contribute_to_class(self, model, name):
    57     def contribute_to_class(self, model, name):
    55         # TODO: Use weakref because of possible memory leak / circular reference.
    58         # TODO: Use weakref because of possible memory leak / circular reference.
    56         self.model = model
    59         self.model = model
    57         setattr(model, name, ManagerDescriptor(self))
    60         setattr(model, name, ManagerDescriptor(self))
    83         mgr._set_creation_counter()
    86         mgr._set_creation_counter()
    84         mgr.model = model
    87         mgr.model = model
    85         mgr._inherited = True
    88         mgr._inherited = True
    86         return mgr
    89         return mgr
    87 
    90 
       
    91     def db_manager(self, using):
       
    92         obj = copy.copy(self)
       
    93         obj._db = using
       
    94         return obj
       
    95 
       
    96     @property
       
    97     def db(self):
       
    98         return self._db or router.db_for_read(self.model)
       
    99 
    88     #######################
   100     #######################
    89     # PROXIES TO QUERYSET #
   101     # PROXIES TO QUERYSET #
    90     #######################
   102     #######################
    91 
   103 
    92     def get_empty_query_set(self):
   104     def get_empty_query_set(self):
    93         return EmptyQuerySet(self.model)
   105         return EmptyQuerySet(self.model, using=self._db)
    94 
   106 
    95     def get_query_set(self):
   107     def get_query_set(self):
    96         """Returns a new QuerySet object.  Subclasses can override this method
   108         """Returns a new QuerySet object.  Subclasses can override this method
    97         to easily customize the behavior of the Manager.
   109         to easily customize the behavior of the Manager.
    98         """
   110         """
    99         return QuerySet(self.model)
   111         return QuerySet(self.model, using=self._db)
   100 
   112 
   101     def none(self):
   113     def none(self):
   102         return self.get_empty_query_set()
   114         return self.get_empty_query_set()
   103 
   115 
   104     def all(self):
   116     def all(self):
   171         return self.get_query_set().defer(*args, **kwargs)
   183         return self.get_query_set().defer(*args, **kwargs)
   172 
   184 
   173     def only(self, *args, **kwargs):
   185     def only(self, *args, **kwargs):
   174         return self.get_query_set().only(*args, **kwargs)
   186         return self.get_query_set().only(*args, **kwargs)
   175 
   187 
       
   188     def using(self, *args, **kwargs):
       
   189         return self.get_query_set().using(*args, **kwargs)
       
   190 
       
   191     def exists(self, *args, **kwargs):
       
   192         return self.get_query_set().exists(*args, **kwargs)
       
   193 
   176     def _insert(self, values, **kwargs):
   194     def _insert(self, values, **kwargs):
   177         return insert_query(self.model, values, **kwargs)
   195         return insert_query(self.model, values, **kwargs)
   178 
   196 
   179     def _update(self, values, **kwargs):
   197     def _update(self, values, **kwargs):
   180         return self.get_query_set()._update(values, **kwargs)
   198         return self.get_query_set()._update(values, **kwargs)
       
   199 
       
   200     def raw(self, raw_query, params=None, *args, **kwargs):
       
   201         return RawQuerySet(raw_query=raw_query, model=self.model, params=params, using=self._db, *args, **kwargs)
   181 
   202 
   182 class ManagerDescriptor(object):
   203 class ManagerDescriptor(object):
   183     # This class ensures managers aren't accessible via model instances.
   204     # This class ensures managers aren't accessible via model instances.
   184     # For example, Poll.objects works, but poll_obj.objects raises AttributeError.
   205     # For example, Poll.objects works, but poll_obj.objects raises AttributeError.
   185     def __init__(self, manager):
   206     def __init__(self, manager):
   186         self.manager = manager
   207         self.manager = manager
   187 
   208 
   188     def __get__(self, instance, type=None):
   209     def __get__(self, instance, type=None):
   189         if instance != None:
   210         if instance != None:
   190             raise AttributeError, "Manager isn't accessible via %s instances" % type.__name__
   211             raise AttributeError("Manager isn't accessible via %s instances" % type.__name__)
   191         return self.manager
   212         return self.manager
   192 
   213 
   193 class EmptyManager(Manager):
   214 class EmptyManager(Manager):
   194     def get_query_set(self):
   215     def get_query_set(self):
   195         return self.get_empty_query_set()
   216         return self.get_empty_query_set()