Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge pull request #642 from dcramer/patch-1

Send post_delete signals immediately
  • Loading branch information...
commit c346d358fdca2e375a0840664165a51a47f4ae69 2 parents 4720117 + a7ed09d
@alex alex authored
View
1  AUTHORS
@@ -142,6 +142,7 @@ answer newbie questions, and generally made Django that much better:
crankycoder@gmail.com
Paul Collier <paul@paul-collier.com>
Robert Coup
+ David Cramer <dcramer@gmail.com>
Pete Crosier <pete.crosier@gmail.com>
Matt Croydon <http://www.postneo.com/>
Jure Cuhalev <gandalf@owca.info>
View
15 django/db/models/deletion.py
@@ -75,17 +75,17 @@ def __init__(self, using):
self.using = using
# Initially, {model: set([instances])}, later values become lists.
self.data = {}
- self.field_updates = {} # {model: {(field, value): set([instances])}}
+ self.field_updates = {} # {model: {(field, value): set([instances])}}
# fast_deletes is a list of queryset-likes that can be deleted without
# fetching the objects into memory.
- self.fast_deletes = []
+ self.fast_deletes = []
# Tracks deletion-order dependency for databases without transactions
# or ability to defer constraint checks. Only concrete model classes
# should be included, as the dependencies exist only between actual
# database tables; proxy models are represented here by their concrete
# parent.
- self.dependencies = {} # {model: set([models])}
+ self.dependencies = {} # {model: set([models])}
def add(self, objs, source=None, nullable=False, reverse_dependency=False):
"""
@@ -301,12 +301,11 @@ def delete(self):
pk_list = [obj.pk for obj in instances]
query.delete_batch(pk_list, self.using)
- # send post_delete signals
- for model, obj in self.instances_with_model():
if not model._meta.auto_created:
- signals.post_delete.send(
- sender=model, instance=obj, using=self.using
- )
+ for obj in instances:
+ signals.post_delete.send(
+ sender=model, instance=obj, using=self.using
+ )
# update collected instances
for model, instances_for_fieldvalues in six.iteritems(self.field_updates):
View
21 tests/modeltests/delete/tests.py
@@ -229,6 +229,27 @@ def log_pre_delete(sender, **kwargs):
models.signals.post_delete.disconnect(log_post_delete)
models.signals.post_delete.disconnect(log_pre_delete)
+ def test_relational_post_delete_signals_happen_before_parent_object(self):
+ deletions = []
+
+ def log_post_delete(instance, **kwargs):
+ self.assertTrue(R.objects.filter(pk=instance.r_id))
+ self.assertEquals(type(instance), S)
+ deletions.append(instance.id)
+
+ r = R.objects.create(pk=1)
+ S.objects.create(pk=1, r=r)
+
+ models.signals.post_delete.connect(log_post_delete, sender=S)
+
+ try:
+ r.delete()
+ finally:
+ models.signals.post_delete.disconnect(log_post_delete)
+
+ self.assertEquals(len(deletions), 1)
+ self.assertEquals(deletions[0], 1)
+
@skipUnlessDBFeature("can_defer_constraint_checks")
def test_can_defer_constraint_checks(self):
u = User.objects.create(
Please sign in to comment.
Something went wrong with that request. Please try again.