summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
Diffstat (limited to 'django')
-rw-r--r--django/db/models/deletion.py24
1 files changed, 19 insertions, 5 deletions
diff --git a/django/db/models/deletion.py b/django/db/models/deletion.py
index e3c38a03cc..dffdf808d1 100644
--- a/django/db/models/deletion.py
+++ b/django/db/models/deletion.py
@@ -144,6 +144,18 @@ class Collector(object):
return False
return True
+ def get_del_batches(self, objs, field):
+ """
+ Returns the objs in suitably sized batches for the used connection.
+ """
+ conn_batch_size = max(
+ connections[self.using].ops.bulk_batch_size([field.name], objs), 1)
+ if len(objs) > conn_batch_size:
+ return [objs[i:i + conn_batch_size]
+ for i in range(0, len(objs), conn_batch_size)]
+ else:
+ return [objs]
+
def collect(self, objs, source=None, nullable=False, collect_related=True,
source_attr=None, reverse_dependency=False):
"""
@@ -192,11 +204,13 @@ class Collector(object):
field = related.field
if field.rel.on_delete == DO_NOTHING:
continue
- sub_objs = self.related_objects(related, new_objs)
- if self.can_fast_delete(sub_objs, from_field=field):
- self.fast_deletes.append(sub_objs)
- elif sub_objs:
- field.rel.on_delete(self, field, sub_objs, self.using)
+ batches = self.get_del_batches(new_objs, field)
+ for batch in batches:
+ sub_objs = self.related_objects(related, batch)
+ if self.can_fast_delete(sub_objs, from_field=field):
+ self.fast_deletes.append(sub_objs)
+ elif sub_objs:
+ field.rel.on_delete(self, field, sub_objs, self.using)
for field in model._meta.virtual_fields:
if hasattr(field, 'bulk_related_objects'):
# Its something like generic foreign key.