Aufhebung der Kreisimporte in Sellerie und Django

8

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?

    
Chinmay Kanchi 15.10.2014, 09:28
quelle

4 Antworten

3

Verwenden Sie Signale.

tasks.py

%Vor%

models.py

%Vor%     
joshua 16.10.2014, 18:31
quelle
6

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:

%Vor%

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.

    
Piotr Ćwiek 22.05.2015 13:01
quelle
5

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.

%Vor%

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

%Vor%     
ChillarAnand 15.10.2014 12:37
quelle
5

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.

    
umbrae 20.04.2017 21:42
quelle