Ich brauche einen Platz, um einen Initialisierungscode auszuführen, der anwendungsspezifisch ist (wie zum Beispiel die Verbindung zu Signalen).
Wenn ich den Code in __init__.py
-Modul einer Anwendung einfüge, habe ich einen kreisförmigen Import der Modelle erhalten.
Gibt es eine Möglichkeit, eine Funktion auszulösen, wenn das Framework eingerichtet wird und bevor eine Anfrage ausgeführt wird?
Ich benutze ziemlich alte Version von django 96.6, aber ich bin auch an den Lösungen für die aktuelle Version interessiert.
In Bezug auf die Duplizierung anderer Fragen: Hier unterscheidet sich die Frage von den von S.Lott in Kommentaren vorgeschlagenen Duplikaten:
Korrekter Ort, an dem zusätzlicher Startcode eingegeben werden kann Django? Django muss vollständig initialisiert werden, wenn die Funktion ausgeführt wird. Also Code in manage.py wird nicht funktionieren.
Wo sollte ich die einmalige Operation im Django-Framework platzieren? Die Funktion initialisiert die Verbindung zwischen meinen Anwendungen. Daher muss der Code in jedem Thread ausgeführt werden, der die Anforderungen tatsächlich verarbeitet.
Kommentare zu aktuellen Lösungen: Ich kann keine URLs verwenden, da die meisten meiner Apps keine URLs enthalten. Sie hören nur Signale und speichern zusätzliche Informationen in der Datenbank.
Es empfiehlt sich, Signale in die models.py Ihrer App zu übernehmen.
Versuchen Sie models.py oder urls.py und teilen Sie uns mit, wenn Sie Glück haben.
Der beste Ort für sowas ... überall, importieren Sie es einfach in Ihre urls.py-Datei (aus offensichtlichen Gründen werden URLs vor allen Anfragen geladen).
Wenn Sie keine URLs angeben, müssen Sie sie wirklich in models.py
einfügen, das ist genau so.
Nun zu deinen Problemen: Du willst es in einem eigenen Modul definieren, großartig, mach das. Um einen zirkulären Import zu vermeiden, verwenden Sie django.db.models.get_model
, um das Modell dynamisch für Sie zurückzugeben. Sie können eine Initialisierungsfunktion für Ihr Signalmodul bereitstellen, um das entsprechende Modell zu importieren und die relevanten Signale zu verbinden. Diese Funktion würde dann am Ende von models.py
aufgerufen und nur einmal und nach der Initialisierung Ihres Modells ausgeführt.
Es besteht immer noch die Möglichkeit, dass das nicht funktioniert (wenn die Modelle noch nicht fertig sind, wenn Sie es einrichten), aber versuchen Sie es und lassen Sie es uns wissen.