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() |