Skip to content

Commit 35c6c4c

Browse files
committed
Cleanly disconnect signals when manager gets destroyed
1 parent e5f721c commit 35c6c4c

File tree

1 file changed

+28
-17
lines changed

1 file changed

+28
-17
lines changed

psqlextra/manager.py

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -63,27 +63,20 @@ def __init__(self, *args, **kwargs):
6363

6464
# hook into django signals to then trigger our own
6565

66-
def on_model_save(sender, **kwargs):
67-
"""When a model gets created or updated."""
68-
69-
created, instance = kwargs['created'], kwargs['instance']
70-
71-
if created:
72-
signals.create.send(sender, pk=instance.pk)
73-
else:
74-
signals.update.send(sender, pk=instance.pk)
75-
7666
django.db.models.signals.post_save.connect(
77-
on_model_save, sender=self.model, weak=False)
67+
self._on_model_save, sender=self.model, weak=False)
7868

79-
def on_model_delete(sender, **kwargs):
80-
"""When a model gets deleted."""
69+
django.db.models.signals.pre_delete.connect(
70+
self._on_model_delete, sender=self.model, weak=False)
8171

82-
instance = kwargs['instance']
83-
signals.delete.send(sender, pk=instance.pk)
72+
def __del__(self):
73+
"""Disconnects signals."""
8474

85-
django.db.models.signals.pre_delete.connect(
86-
on_model_delete, sender=self.model, weak=False)
75+
django.db.models.signals.post_save.disconnect(
76+
self._on_model_save, sender=self.model, weak=False)
77+
78+
django.db.models.signals.pre_delete.disconnect(
79+
self._on_model_delete, sender=self.model, weak=False)
8780

8881
def get_queryset(self):
8982
"""Gets the query set to be used on this manager."""
@@ -259,3 +252,21 @@ def _get_upsert_fields(self, kwargs):
259252
update_fields.append(field)
260253

261254
return insert_fields, update_fields
255+
256+
@staticmethod
257+
def _on_model_save(sender, **kwargs):
258+
"""When a model gets created or updated."""
259+
260+
created, instance = kwargs['created'], kwargs['instance']
261+
262+
if created:
263+
signals.create.send(sender, pk=instance.pk)
264+
else:
265+
signals.update.send(sender, pk=instance.pk)
266+
267+
@staticmethod
268+
def _on_model_delete(sender, **kwargs):
269+
"""When a model gets deleted."""
270+
271+
instance = kwargs['instance']
272+
signals.delete.send(sender, pk=instance.pk)

0 commit comments

Comments
 (0)