Ich habe eine Django-App, die Sellerie verwendet, um einige Aufgaben zu entfernen. Hauptsächlich wird die Berechnung einiger Felder in einer Datenbanktabelle verschoben.
Also, ich habe eine task.py:
%Vor%Und in models.py
%Vor% Nun wird das natürlich nicht funktionieren wegen eines zirkulären Imports ( models
imports tasks
und tasks
imports models
).
Ich habe das für den Moment gelöst, indem ich my_task.delay()
von views.py
aufgerufen habe, aber es scheint sinnvoll zu sein, die Modelllogik innerhalb der Modellklasse zu belassen. Gibt es einen besseren Weg, dies zu tun?
Die Lösung von joshua ist sehr gut, aber als ich es zum ersten Mal probiert habe, habe ich festgestellt, dass meine @receiver
Decorators keinen Effekt hatten. Das war, weil das Modul tasks
nicht irgendwo importiert wurde, was erwartet wurde, da ich Automatische Erkennung der Aufgabe .
Es gibt jedoch eine andere Möglichkeit, tasks.py
von modules.py
zu entkoppeln. Tasks können namentlich gesendet werden und müssen nicht in dem Prozess, der sie sendet, ausgewertet (importiert) werden:
send_task()
ist eine Methode für Sellery-App-Objekte.
Bei dieser Lösung ist es wichtig, auf korrekte Angaben zu achten , vorhersagbare Namen für Ihre Aufgaben.
In Ihren Modellen können Sie den my_task
am Anfang der Datei importieren, bevor Sie ihn verwenden. Es löst das zirkuläre Importproblem.
Alternativ können Sie auch in Ihrem tasks.py
dasselbe tun. Sie können Ihre Modelle unmittelbar vor der Verwendung importieren, anstatt sie zu beginnen.
Alternative:
Sie können die Methode send_task
verwenden, um Ihre Aufgabe aufzurufen
Um nur eine weitere nicht großartige Lösung in diese Liste zu packen, stütze ich mich auf django's jetzt eingebaute App-Registry .
Also in tasks.py
, anstatt von Modellen zu importieren, verwenden Sie apps.get_model()
, um Zugriff auf das Modell zu erhalten.
Ich mache das mit einer Hilfsmethode mit einer gesunden Dokumentation, nur um auszudrücken, warum das schmerzhaft ist:
%Vor%Und dann:
%Vor% Du könntest einfach apps.get_model()
direkt verwenden.
Tags und Links python django celery circular-dependency django-celery