Verwenden Sie Signale.
tasks.py
%Vor%models.py
%Vor%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 ( %code% imports %code% und %code% imports %code% ).
Ich habe das für den Moment gelöst, indem ich %code% von %code% 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 %code% Decorators keinen Effekt hatten. Das war, weil das Modul %code% nicht irgendwo importiert wurde, was erwartet wurde, da ich Automatische Erkennung der Aufgabe .
Es gibt jedoch eine andere Möglichkeit, %code% von %code% zu entkoppeln. Tasks können namentlich gesendet werden und müssen nicht in dem Prozess, der sie sendet, ausgewertet (importiert) werden:
%Vor%%code% 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.
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 %code% , anstatt von Modellen zu importieren, verwenden Sie %code% , 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 %code% direkt verwenden.
In Ihren Modellen können Sie den %code% am Anfang der Datei importieren, bevor Sie ihn verwenden. Es löst das zirkuläre Importproblem.
%Vor%Alternativ können Sie auch in Ihrem %code% dasselbe tun. Sie können Ihre Modelle unmittelbar vor der Verwendung importieren, anstatt sie zu beginnen.
Alternative:
Sie können die Methode %code% verwenden, um Ihre Aufgabe aufzurufen
%Vor%