diff -r b758351d191f -r cc9b7e14412b web/lib/django/db/models/manager.py --- a/web/lib/django/db/models/manager.py Wed May 19 17:43:59 2010 +0200 +++ b/web/lib/django/db/models/manager.py Tue May 25 02:43:45 2010 +0200 @@ -1,9 +1,11 @@ -import copy - -from django.db.models.query import QuerySet, EmptyQuerySet, insert_query +from django.utils import copycompat as copy +from django.conf import settings +from django.db import router +from django.db.models.query import QuerySet, EmptyQuerySet, insert_query, RawQuerySet from django.db.models import signals from django.db.models.fields import FieldDoesNotExist + def ensure_default_manager(sender, **kwargs): """ Ensures that a Model subclass contains a default manager and sets the @@ -18,7 +20,7 @@ # Create the default manager, if needed. try: cls._meta.get_field('objects') - raise ValueError, "Model %s must specify a custom Manager, because it has a field named 'objects'" % cls.__name__ + raise ValueError("Model %s must specify a custom Manager, because it has a field named 'objects'" % cls.__name__) except FieldDoesNotExist: pass cls.add_to_class('objects', Manager()) @@ -50,6 +52,7 @@ self._set_creation_counter() self.model = None self._inherited = False + self._db = None def contribute_to_class(self, model, name): # TODO: Use weakref because of possible memory leak / circular reference. @@ -85,18 +88,27 @@ mgr._inherited = True return mgr + def db_manager(self, using): + obj = copy.copy(self) + obj._db = using + return obj + + @property + def db(self): + return self._db or router.db_for_read(self.model) + ####################### # PROXIES TO QUERYSET # ####################### def get_empty_query_set(self): - return EmptyQuerySet(self.model) + return EmptyQuerySet(self.model, using=self._db) def get_query_set(self): """Returns a new QuerySet object. Subclasses can override this method to easily customize the behavior of the Manager. """ - return QuerySet(self.model) + return QuerySet(self.model, using=self._db) def none(self): return self.get_empty_query_set() @@ -173,12 +185,21 @@ def only(self, *args, **kwargs): return self.get_query_set().only(*args, **kwargs) + def using(self, *args, **kwargs): + return self.get_query_set().using(*args, **kwargs) + + def exists(self, *args, **kwargs): + return self.get_query_set().exists(*args, **kwargs) + def _insert(self, values, **kwargs): return insert_query(self.model, values, **kwargs) def _update(self, values, **kwargs): return self.get_query_set()._update(values, **kwargs) + def raw(self, raw_query, params=None, *args, **kwargs): + return RawQuerySet(raw_query=raw_query, model=self.model, params=params, using=self._db, *args, **kwargs) + class ManagerDescriptor(object): # This class ensures managers aren't accessible via model instances. # For example, Poll.objects works, but poll_obj.objects raises AttributeError. @@ -187,7 +208,7 @@ def __get__(self, instance, type=None): if instance != None: - raise AttributeError, "Manager isn't accessible via %s instances" % type.__name__ + raise AttributeError("Manager isn't accessible via %s instances" % type.__name__) return self.manager class EmptyManager(Manager):