diff options
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/deletion.py | 24 |
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. |
