summaryrefslogtreecommitdiff
path: root/django/db/models/sql
diff options
context:
space:
mode:
authorCarl Meyer <carl@oddbird.net>2010-11-09 16:46:42 +0000
committerCarl Meyer <carl@oddbird.net>2010-11-09 16:46:42 +0000
commit616b30227d901a7452810a9ffaa55eaf186dc9e1 (patch)
treea90a046c56bc8c25fc3ce5c0021c02b8ff77c0ba /django/db/models/sql
parent3ba3294c6b5ad413731223a9e46064a8e132acd2 (diff)
Fixed #7539, #13067 -- Added on_delete argument to ForeignKey to control cascade behavior. Also refactored deletion for efficiency and code clarity. Many thanks to Johannes Dollinger and Michael Glassford for extensive work on the patch, and to Alex Gaynor, Russell Keith-Magee, and Jacob Kaplan-Moss for review.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@14507 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models/sql')
-rw-r--r--django/db/models/sql/subqueries.py19
1 files changed, 7 insertions, 12 deletions
diff --git a/django/db/models/sql/subqueries.py b/django/db/models/sql/subqueries.py
index bad84c8eb8..a62adfe0fc 100644
--- a/django/db/models/sql/subqueries.py
+++ b/django/db/models/sql/subqueries.py
@@ -27,16 +27,17 @@ class DeleteQuery(Query):
self.where = where
self.get_compiler(using).execute_sql(None)
- def delete_batch(self, pk_list, using):
+ def delete_batch(self, pk_list, using, field=None):
"""
Set up and execute delete queries for all the objects in pk_list.
More than one physical query may be executed if there are a
lot of values in pk_list.
"""
+ if not field:
+ field = self.model._meta.pk
for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
where = self.where_class()
- field = self.model._meta.pk
where.add((Constraint(None, field.column, field), 'in',
pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), AND)
self.do_query(self.model._meta.db_table, where, using=using)
@@ -68,20 +69,14 @@ class UpdateQuery(Query):
related_updates=self.related_updates.copy(), **kwargs)
- def clear_related(self, related_field, pk_list, using):
- """
- Set up and execute an update query that clears related entries for the
- keys in pk_list.
-
- This is used by the QuerySet.delete_objects() method.
- """
+ def update_batch(self, pk_list, values, using):
+ pk_field = self.model._meta.pk
+ self.add_update_values(values)
for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
self.where = self.where_class()
- f = self.model._meta.pk
- self.where.add((Constraint(None, f.column, f), 'in',
+ self.where.add((Constraint(None, pk_field.column, pk_field), 'in',
pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]),
AND)
- self.values = [(related_field, None, None)]
self.get_compiler(using).execute_sql(None)
def add_update_values(self, values):