51
55
class RenameManagerMethods(RenameMethodsBase):
52
56
renamed_methods = (
53
('get_query_set', 'get_queryset', PendingDeprecationWarning),
54
('get_prefetch_query_set', 'get_prefetch_queryset', PendingDeprecationWarning),
57
('get_query_set', 'get_queryset', RemovedInDjango18Warning),
58
('get_prefetch_query_set', 'get_prefetch_queryset', RemovedInDjango18Warning),
58
class Manager(six.with_metaclass(RenameManagerMethods)):
62
@python_2_unicode_compatible
63
class BaseManager(six.with_metaclass(RenameManagerMethods)):
59
64
# Tracks each time a Manager instance is created. Used to retain order.
60
65
creation_counter = 0
62
67
def __init__(self):
63
super(Manager, self).__init__()
68
super(BaseManager, self).__init__()
64
69
self._set_creation_counter()
66
71
self._inherited = False
76
""" Return "app_label.model_label.manager_name". """
79
app = model._meta.app_label
80
manager_name = next(name for (_, name, manager)
81
in opts.concrete_managers + opts.abstract_managers
83
return '%s.%s.%s' % (app, model._meta.object_name, manager_name)
85
def check(self, **kwargs):
89
def _get_queryset_methods(cls, queryset_class):
90
def create_method(name, method):
91
def manager_method(self, *args, **kwargs):
92
return getattr(self.get_queryset(), name)(*args, **kwargs)
93
manager_method.__name__ = method.__name__
94
manager_method.__doc__ = method.__doc__
98
# Refs http://bugs.python.org/issue1785.
99
predicate = inspect.isfunction if six.PY3 else inspect.ismethod
100
for name, method in inspect.getmembers(queryset_class, predicate=predicate):
101
# Only copy missing methods.
102
if hasattr(cls, name):
104
# Only copy public methods or methods with the attribute `queryset_only=False`.
105
queryset_only = getattr(method, 'queryset_only', None)
106
if queryset_only or (queryset_only is None and name.startswith('_')):
108
# Copy the method onto the manager.
109
new_methods[name] = create_method(name, method)
113
def from_queryset(cls, queryset_class, class_name=None):
114
if class_name is None:
115
class_name = '%sFrom%s' % (cls.__name__, queryset_class.__name__)
117
'_queryset_class': queryset_class,
119
class_dict.update(cls._get_queryset_methods(queryset_class))
120
return type(class_name, (cls,), class_dict)
69
122
def contribute_to_class(self, model, name):
70
123
# TODO: Use weakref because of possible memory leak / circular reference.
107
160
mgr._inherited = True
110
def db_manager(self, using):
163
def db_manager(self, using=None, hints=None):
111
164
obj = copy.copy(self)
165
obj._db = using or self._db
166
obj._hints = hints or self._hints
117
return self._db or router.db_for_read(self.model)
171
return self._db or router.db_for_read(self.model, **self._hints)
119
173
#######################
120
174
# PROXIES TO QUERYSET #
121
175
#######################
123
177
def get_queryset(self):
124
"""Returns a new QuerySet object. Subclasses can override this method
125
to easily customize the behavior of the Manager.
127
return QuerySet(self.model, using=self._db)
130
return self.get_queryset().none()
179
Returns a new QuerySet object. Subclasses can override this method to
180
easily customize the behavior of the Manager.
182
return self._queryset_class(self.model, using=self._db, hints=self._hints)
185
# We can't proxy this method through the `QuerySet` like we do for the
186
# rest of the `QuerySet` methods. This is because `QuerySet.all()`
187
# works by creating a "copy" of the current queryset and in making said
188
# copy, all the cached `prefetch_related` lookups are lost. See the
189
# implementation of `RelatedManager.get_queryset()` for a better
190
# understanding of how this comes into play.
133
191
return self.get_queryset()
136
return self.get_queryset().count()
138
def dates(self, *args, **kwargs):
139
return self.get_queryset().dates(*args, **kwargs)
141
def datetimes(self, *args, **kwargs):
142
return self.get_queryset().datetimes(*args, **kwargs)
144
def distinct(self, *args, **kwargs):
145
return self.get_queryset().distinct(*args, **kwargs)
147
def extra(self, *args, **kwargs):
148
return self.get_queryset().extra(*args, **kwargs)
150
def get(self, *args, **kwargs):
151
return self.get_queryset().get(*args, **kwargs)
153
def get_or_create(self, **kwargs):
154
return self.get_queryset().get_or_create(**kwargs)
156
def create(self, **kwargs):
157
return self.get_queryset().create(**kwargs)
159
def bulk_create(self, *args, **kwargs):
160
return self.get_queryset().bulk_create(*args, **kwargs)
162
def filter(self, *args, **kwargs):
163
return self.get_queryset().filter(*args, **kwargs)
165
def aggregate(self, *args, **kwargs):
166
return self.get_queryset().aggregate(*args, **kwargs)
168
def annotate(self, *args, **kwargs):
169
return self.get_queryset().annotate(*args, **kwargs)
171
def complex_filter(self, *args, **kwargs):
172
return self.get_queryset().complex_filter(*args, **kwargs)
174
def exclude(self, *args, **kwargs):
175
return self.get_queryset().exclude(*args, **kwargs)
177
def in_bulk(self, *args, **kwargs):
178
return self.get_queryset().in_bulk(*args, **kwargs)
180
def iterator(self, *args, **kwargs):
181
return self.get_queryset().iterator(*args, **kwargs)
183
def earliest(self, *args, **kwargs):
184
return self.get_queryset().earliest(*args, **kwargs)
186
def latest(self, *args, **kwargs):
187
return self.get_queryset().latest(*args, **kwargs)
190
return self.get_queryset().first()
193
return self.get_queryset().last()
195
def order_by(self, *args, **kwargs):
196
return self.get_queryset().order_by(*args, **kwargs)
198
def select_for_update(self, *args, **kwargs):
199
return self.get_queryset().select_for_update(*args, **kwargs)
201
def select_related(self, *args, **kwargs):
202
return self.get_queryset().select_related(*args, **kwargs)
204
def prefetch_related(self, *args, **kwargs):
205
return self.get_queryset().prefetch_related(*args, **kwargs)
207
def values(self, *args, **kwargs):
208
return self.get_queryset().values(*args, **kwargs)
210
def values_list(self, *args, **kwargs):
211
return self.get_queryset().values_list(*args, **kwargs)
213
def update(self, *args, **kwargs):
214
return self.get_queryset().update(*args, **kwargs)
216
def reverse(self, *args, **kwargs):
217
return self.get_queryset().reverse(*args, **kwargs)
219
def defer(self, *args, **kwargs):
220
return self.get_queryset().defer(*args, **kwargs)
222
def only(self, *args, **kwargs):
223
return self.get_queryset().only(*args, **kwargs)
225
def using(self, *args, **kwargs):
226
return self.get_queryset().using(*args, **kwargs)
228
def exists(self, *args, **kwargs):
229
return self.get_queryset().exists(*args, **kwargs)
231
def _insert(self, objs, fields, **kwargs):
232
return insert_query(self.model, objs, fields, **kwargs)
234
def _update(self, values, **kwargs):
235
return self.get_queryset()._update(values, **kwargs)
237
def raw(self, raw_query, params=None, *args, **kwargs):
238
return RawQuerySet(raw_query=raw_query, model=self.model, params=params, using=self._db, *args, **kwargs)
194
class Manager(BaseManager.from_queryset(QuerySet)):
241
198
class ManagerDescriptor(object):