From f771586debb84c11ee864355631470929d2b345a Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Mon, 30 Jan 2006 03:17:19 +0000 Subject: [PATCH] magic-removal: Moved delete() from Manager to QuerySet git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@2166 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/manager.py | 51 +------------------------------------ django/db/models/query.py | 36 ++++++++++++++++++++------ 2 files changed, 29 insertions(+), 58 deletions(-) diff --git a/django/db/models/manager.py b/django/db/models/manager.py index bd4a4c3326..fe15f125b1 100644 --- a/django/db/models/manager.py +++ b/django/db/models/manager.py @@ -35,32 +35,7 @@ dispatcher.connect(ensure_default_manager, signal=signals.class_prepared) # params=id_list) # obj_list = list(new_query) # return dict([(obj._get_pk_val(), obj) for obj in obj_list]) -# -# def delete(self, **kwargs): -# # Remove the DELETE_ALL argument, if it exists. -# delete_all = kwargs.pop('DELETE_ALL', False) -# -# # Check for at least one query argument. -# if not kwargs and not delete_all: -# raise TypeError, "SAFETY MECHANISM: Specify DELETE_ALL=True if you actually want to delete all data." -# -# if kwargs: -# del_query = self.filter(**kwargs) -# else: -# del_query = self._clone() -# # disable non-supported fields -# del_query._select_related = False -# del_query._select = {} -# del_query._order_by = [] -# del_query._offset = None -# del_query._limit = None -# -# opts = self.klass._meta -# -# # Perform the SQL delete -# cursor = connection.cursor() -# _, sql, params = del_query._get_sql_clause(False) -# cursor.execute("DELETE " + sql, params) + class Manager(QuerySet): # Tracks each time a Manager instance is created. Used to retain order. @@ -88,30 +63,6 @@ class Manager(QuerySet): if not hasattr(klass, '_default_manager') or self.creation_counter < klass._default_manager.creation_counter: klass._default_manager = self - def delete(self, *args, **kwargs): - num_args = len(args) + len(kwargs) - - # Remove the DELETE_ALL argument, if it exists. - delete_all = kwargs.pop('DELETE_ALL', False) - - # Check for at least one query argument. - if num_args == 0 and not delete_all: - raise TypeError, "SAFETY MECHANISM: Specify DELETE_ALL=True if you actually want to delete all data." - - # disable non-supported fields - kwargs['select_related'] = False - kwargs['select'] = {} - kwargs['order_by'] = [] - kwargs['offset'] = None - kwargs['limit'] = None - - opts = self.klass._meta - - # Perform the SQL delete - cursor = connection.cursor() - _, sql, params = self._get_sql_clause(False, *args, **kwargs) - cursor.execute("DELETE " + sql, params) - def in_bulk(self, id_list, *args, **kwargs): assert isinstance(id_list, list), "get_in_bulk() must be provided with a list of IDs." assert id_list != [], "get_in_bulk() cannot be passed an empty ID list." diff --git a/django/db/models/query.py b/django/db/models/query.py index 068a7c1214..00c17b1ba1 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -138,6 +138,34 @@ class QuerySet(object): assert len(obj_list) == 1, "get() returned more than one %s -- it returned %s! Lookup parameters were %s" % (self.klass._meta.object_name, len(obj_list), kwargs) return obj_list[0] + def delete(self, **kwargs): + """ + Deletes the records with the given kwargs. If no kwargs are given, + deletes records in the current QuerySet. + """ + # Remove the DELETE_ALL argument, if it exists. + delete_all = kwargs.pop('DELETE_ALL', False) + + # Check for at least one query argument. + if not kwargs and not delete_all: + raise TypeError, "SAFETY MECHANISM: Specify DELETE_ALL=True if you actually want to delete all data." + + if kwargs: + del_query = self.filter(**kwargs) + else: + del_query = self._clone() + # disable non-supported fields + del_query._select_related = False + del_query._select = {} + del_query._order_by = [] + del_query._offset = None + del_query._limit = None + + # Perform the SQL delete + cursor = connection.cursor() + _, sql, params = del_query._get_sql_clause(False) + cursor.execute("DELETE " + sql, params) + ############################################# # PUBLIC METHODS THAT RETURN A NEW QUERYSET # ############################################# @@ -292,14 +320,6 @@ class QuerySet(object): # combined._filter = self._filter | other._filter # return combined # -# def _fetch_data(self): -# if self._use_cache: -# if self._result_cache is None: -# self._result_cache = list(self.get_iterator()) -# return self._result_cache -# else: -# return list(self.get_iterator()) -# # def __getitem__(self, k): # """Retrieve an item or slice from the set of results""" # # getitem can't return query instances, because .filter()