Ich dachte, es gab eine einfache Antwort auf diese in den letzten Versionen von Django, aber ich kann es nicht finden.Django: Ausführen von Code bei jedem Start, aber nachdem die Datenbank migriert wurde
Ich habe Code, der die Datenbank berührt. Ich möchte, dass es jedes Mal läuft, wenn Django startet. Ich scheine zwei Möglichkeiten zu haben:
Option 1.AppConfig.ready()
- das funktioniert aber läuft auch vor Datenbanktabellen erstellt wurden (das heißt während des Tests oder wenn neu initialisiert die App ohne Daten). Wenn ich diese verwenden muss ich mehrere Arten von Ausnahmen und erraten, fangen, dass die Ursache ist eine leere db:
def is_db_init_error(e, table_name):
return ("{}' doesn't exist".format(table_name) in str(e) or
"no such table: {}".format(table_name) in str(e)
)
try:
# doing stuff
except Exception as e:
if not is_db_init_error(e, 'foo'):
raise
else:
logger.warn("Skipping updating Foo object as db table doesn't exist")
Option 2. Verwendung post_migrate.connect(foo_init, sender=self)
- aber das nur läuft, wenn ich eine Migration tun.
Option 3. Der alte Weg - nennen es von urls.py
- ich für Option 2 so weit Sachen wie diese aus urls.py
und ich dachte AppConfig
war der einzig wahre Weg
Ich habe angesiedelt halten wollte - Ich mag nicht den stinkigen Versuch/außer Sachen in Option 1 und Option 3 Bugs mich als urls.py
wird zu einer Müllhalde.
Allerdings stolpert mich Option 2 oft, wenn ich lokal entwickle - ich muss daran denken, Migrationen immer dann auszuführen, wenn ich möchte, dass mein Init-Code läuft. Dinge wie das Herunterfahren einer Produktionsdatenbank oder ähnlichem verursachen oft Probleme, weil Migrationen nicht ausgelöst werden.
Ich habe noch nicht das selbst ausprobiert, aber man konnte die manage.py Datei überschreiben – dentemm