Skip to content

Commit 48460d2

Browse files
committed
Runs celery task on_commit
1 parent e77526f commit 48460d2

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

django_opensearch_dsl/signals.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
"""Attach django-opensearch-dsl to Django's signals and cause things to index."""
22

33
import abc
4+
from functools import partial
45

56
from django.apps import apps
67
from django.core.serializers import deserialize, serialize
7-
from django.db import models
8+
from django.db import models, transaction
89
from django.dispatch import Signal
910

1011
from .apps import DODConfig
@@ -95,7 +96,11 @@ def handle_save_task(app_label, model, pk):
9596
@shared_task()
9697
def handle_pre_delete_task(data):
9798
"""Delete the instance from model and associated model indices."""
98-
instance = next(deserialize("json", data, cls=DODConfig.signal_processor_deserializer_class())).object
99+
instance = next(
100+
deserialize(
101+
"json", data, cls=DODConfig.signal_processor_deserializer_class()
102+
)
103+
).object
99104
registry.delete(instance, raise_on_error=False)
100105
registry.delete_related(instance, raise_on_error=False)
101106

@@ -109,8 +114,21 @@ class CelerySignalProcessor(RealTimeSignalProcessor):
109114
def handle_save(self, sender, instance, **kwargs):
110115
"""Update the instance in model and associated model indices."""
111116
if instance.__class__ in registry.get_models():
112-
handle_save_task.delay(instance._meta.app_label, instance.__class__.__name__, instance.pk)
117+
transaction.on_commit(
118+
partial(
119+
handle_save_task.delay,
120+
app_label=instance._meta.app_label,
121+
model=instance.__class__.__name__,
122+
pk=instance.pk,
123+
)
124+
)
113125

114126
def handle_pre_delete(self, sender, instance, **kwargs):
115127
"""Delete the instance from model and associated model indices."""
116-
handle_pre_delete_task.delay(serialize("json", [instance], cls=DODConfig.signal_processor_serializer_class()))
128+
handle_pre_delete_task.delay(
129+
serialize(
130+
"json",
131+
[instance],
132+
cls=DODConfig.signal_processor_serializer_class(),
133+
)
134+
)

0 commit comments

Comments
 (0)