South erstellt keine Standardberechtigungen für neue Modelle, damit letztere später verwendet werden können

8

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

  • zu initialisieren
  • 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:

  • zu holen

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:

  1. ./manage.py syncdb (dies initialisiert die Standard-Django-Tabellen)
  2. ./manage.py migrate myapp 0001 (dadurch wird die CompanyAccount-Tabelle erstellt)
  3. ./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.

    
glenc 16.05.2011, 21:12
quelle

2 Antworten

5

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:

Ссылка

    
glenc 17.05.2011, 13:07
quelle
1

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.

Ссылка

    
John Mee 16.05.2011 23:31
quelle