2016-10-15 3 views
1

Ich habe eine Django-App, wo ich einen DB-Eintrag in der Ansicht erstellen. Ich möchte dann Hintergrundverarbeitung für den neuen Eintrag durchführen. Anstatt das erstellte Objekt an die Aufgabe zu senden, sende ich die ID des Objekts, dann kann die Hintergrund-Task das db-Objekt abrufen, wie erläutert here. Unten ist mein Code:Django - Verzögerung beim Erstellen des Datenbankeintrags

# In tasks.py 
@shared_task 
def my_task(model_id): 
    my_model = MyModel.objects.get(pk=model_id) 
    # Do stuff with my_model 

# In views.py: 
def some_view(request): 
    if request.method == 'POST' and request.is_ajax(): 
     instance = MyModel.objects.create(**kwargs) 
     tasks.my_task.delay(instance.id) 
     .... 

Allerdings, wenn ich versuchen, das Objekt im Hintergrund Aufgabe zu bekommen, ich passende Abfrage erhalten nicht Fehler existiert. Wenn ich vor dem Abrufen des Objekts sleep(1) hinzufüge, funktioniert es als ausgenommen. Ich verstehe nicht, warum ich diesen Fehler bekomme, da das Objekt in der DB sein sollte? Weiß jemand, wie man das löst? Ich möchte nicht wirklich überall einen Schlafbefehl hinzufügen.

Ich benutze Postgres als meine DB.

Antwort

2

testen

from django.db import transaction 
with transaction.atomic(): 
    instance = MyModel.objects.create(**kwargs) 
tasks.my_task.delay(instance.id) 
+0

so vielen Dank! Ich habe stundenlang damit zu kämpfen! – Johan

+0

Ich musste eigentlich transaction.non_atomic_requests verwenden, da atomare Anfragen bereits an waren – Johan

Verwandte Themen