Ich bin nicht 100% sicher, dass ich das richtig mache, aber ich glaube, ich habe ein Problem gefunden, bei dem auth.Permission
-Objekte nicht schnell genug erstellt werden, damit Migrationen sie verwenden können, wenn Sie eine Datenbank von Grund auf neu initialisieren .
Die wichtigen Details:
Ich versuche eine Django DB von Grund auf mit ./manage.py syncdb --migrate --noinput
Ich habe 11 Migrationen in meiner Kette
Die erste Migration erstellt ein neues Modell mit dem Namen myapp.CompanyAccount
Die 9. Migration versucht, die Berechtigung myapp.change_companyaccount
mit:
p = orm[ "auth.Permission" ].objects.get( codename = "change_companyaccount" )
An diesem Punkt wird eine Ausnahme ausgelöst:
django.contrib.auth.models.DoesNotExist: Permission matching query does not exist
Ich hatte angenommen, dass die Standardberechtigungen für jedes Objekt definiert sind (gemäß Ссылка ) wäre bis zum Ende der 1. Migration erstellt worden, aber es scheint nicht so zu sein. Wenn ich die Migration nach der Ausnahme erneut durchführe, funktioniert sie ein zweites Mal, weil die Berechtigung jetzt offensichtlich vorhanden ist und die 9. Migration ohne Fehler ausgeführt werden kann.
Gibt es etwas, was getan werden kann, um alles vor der 9. Migration zu "spülen", so dass die ganze Sache in einem einzigen Durchgang laufen kann, ohne dass sie freigelassen wird?
Danke für jede Hilfe / Beratung.
EDIT: Als Antwort auf den Kommentar von John unten habe ich herausgefunden, dass die folgende Befehlszeilensequenz funktioniert:
./manage.py syncdb
(dies initialisiert die Standard-Django-Tabellen) ./manage.py migrate myapp 0001
(dadurch wird die CompanyAccount-Tabelle erstellt) ./manage.py migrate myapp
(dies migriert den ganzen Weg bis zum Ende ohne Fehler) Leider führt das Überspringen von Schritt 2 dazu, dass Sie dieselbe Ausnahme in der 0009-Migration erhalten, die mir sagt, dass mein ursprünglicher Verdacht richtig war, dass Standardberechtigungen für neue Modelle nicht sofort von South erstellt werden und irgendwie nur hineingeschoben werden die Datenbank, wenn die gesamte Migrationskette abgeschlossen ist.
Das ist besser als wo ich war (ich vermeide jetzt zumindest Ausnahmen), aber ich muss die Migration immer noch um die Erstellung neuer Modelle herum segmentieren, damit die letztgenannten Migrationen möglicherweise die Berechtigungen von erfüllen müssen. t eine vollständige Lösung.
Wie sich herausstellt, lautet die Antwort, dass Sie db.send_pending_create_signals()
manuell aufrufen müssen, bevor Sie versuchen, auf die Standardberechtigung zuzugreifen, da South diesen "Spülung" -Schritt erst ziemlich spät ausführt. Danke an Andrew Godwin aus dem Süden für die Antwort hier auf der South-Mailingliste:
Sie müssen nicht den Standard "syncdb" in einer neuen Datenbank ausführen, um die South-Migrationstabelle zu erstellen. bevor du den Süden benutzen kannst. Machst du das? Normalerweise erstellt es zu diesem Zeitpunkt die Berechtigungstabelle, da Sie django.contrib.auth in INSTALLED_APPS haben.
Tags und Links django data-migration django-south