2015-04-17 15 views
42

Wenn Django 1.8 (mit zc.buildout) ein Upgrade und Lauf syncdb oder migrieren, erhalte ich diese Meldung:auth_user Fehler mit Django 1.8 und syncdb/migrieren

django.db.utils.ProgrammingError: relation "auth_user" does not exist

Einer meiner Modelle enthält django. contrib.auth.models.User:

user = models.ForeignKey(
    User, related_name='%(app_label)s_%(class)s_user', 
    blank=True, null=True, editable=False 
) 

Downgrade auf Django 1.7 entfernt den Fehler. Muss ich das Benutzerobjekt in Django 1.8 anders aufnehmen?

+1

Auf meiner Umgebung, dies nur mit 'Postgre' passieren. –

Antwort

0

Versuchen Sie, den Benutzer unter Bezugnahme mit diesem

from django.conf import settings 
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='%(app_label)s_%(class)s_user', blank=True, null=True, editable=False) 
+0

Funktioniert nicht für mich. Ich habe keine Migrationen, versuche nur den ./manage.py Test auszuführen und der Fehler schlägt sofort fehl, wenn migrate ausgeführt wird: django.db.utils.ProgrammingError: relation "auth_user" existiert nicht – radtek

+0

Die Lösung ist, dass Sie Ihre Modelle haben auf Fremdschlüssel für auth_model auch unter Migrationen angewiesen. Gute Praxis insgesamt, seit Syncdb in Django 1 verschwunden ist.9 – radtek

3

dieses Problem hier zu beheben ist, was ich tat:

1) Suche alle Fremdschlüssel Beziehung Felder wie OneToOneField, ForeignKey und ManyToManyFields in Ihrem Projekt, einschließlich aller wiederverwendbaren Apps, die sich auf auth.User beziehen oder Benutzer importieren und wie oben beschrieben auf settings.AUTH_USER_MODEL setzen. Bei minimaler Verwendung:

'auth.User' 

2) Für alle Modelle, die die oben haben, stellen Sie sicher, dass die Modelle eine gültige django Migration (nicht nach Süden). Wenn sie nach Süden Migrationen haben, benennen Sie das Verzeichnis migrations_south und dann dem makemigrations Befehl für diese Anwendung ausführen:

./manage.py makemigrations affected_app 

Manchmal gibt einen django Migrationen Ordner unter einem anderen Namen, nicht das Standard-migrations Verzeichnis. In solchen Fällen verweisen dies über MIGRATION_MODULES in Ihrem settings.py:

MIGRATION_MODULES = {'filer': 'filer.migrations_django'} 

Da die Frage war hart größere Projekte zu finden, ich bemerkte aus allen benutzerdefinierten Anwendungen in INSTALLED_APPS in settings.py und lief den Testbefehl, da wird es laufen wandern und versuchen, die Datenbank für Sie neu zu erstellen:

./manage.py test 

aussieht, dass es für mich fixiert. Ich bin mir nicht sicher, ob Schritt 1 obligatorisch ist oder nur Best Practice. Aber Sie müssen die Apps definitiv in Migrationen umwandeln.

Prost!

PS. Sei bereit für was kommt in Django 1.9. Der syncdb-Befehl wird entfernt. Die herkömmliche Methode zum Synchronisieren von Apps ohne Migrationen wurde entfernt und Migrationen sind für alle Apps obligatorisch.

92

ich dieses Problem beheben, indem Auth läuft der Rest meiner Migrationen zuerst, dann:

python manage.py migrate auth 
python manage.py migrate 
+3

Ihre Auth-App sollte bereits in INSTALLED_APPS, d. H. "Django.contrib.admin", ganz oben stehen, wenn sie in der richtigen Reihenfolge nicht die oben genannten Auswirkungen hat. – radtek

+8

Ich bekomme 'Beziehung" django_site "existiert nicht'. Ich bin auf Django 1.8.2. Ich habe ein paar verschiedene Apps in meinem Projekt ausprobiert und immer den gleichen Fehler bekommen, dann habe ich 'python manage.py migrate' erneut ausgeführt, und siehe da, es hat funktioniert. – trpt4him

+1

Vielen Dank, Sie haben mich gerettet –

17

Auf meiner Umgebung, ich dieses Problem beheben laufen makemigrations auf alle Anwendungen, die Beziehung mit django.contrib.auth.models:

 
manage.py makemigrations app_with_user_relation 
manage.py migrate 
+0

Ich hatte das gleiche Problem und diese Lösung hat funktioniert. Wenn ich von Django 1.7.X zu 1.8.1 – Daviddd

+0

gehe, kann ich bestätigen, dass dies immer noch funktioniert und für die Verwendung mit Heroku. – James

7

Wenn Sie Heroku verwenden, wie ich ausgeführt wurde

Dies wird Ihnen wahrscheinlich eine Nachricht geben, dass es jetzt Änderungen gibt.Ignoriere das dann

heroku run python manage.py migrate 

Dies wird Ihnen etwas Ausgang, was darauf hindeutet, dass etwas getan worden ist. Schließlich laufen

heroku run python manage.py createsuperuser 
16

Ich hatte auch das gleiche Problem, das ich es durch die Verwendung gelöst diese:

python manage.py migrate auth 
python manage.py migrate 

Dann wandern macht seinen Job

+0

Probieren Sie es einfach aus und es funktionierte auf einer ähnlichen Fehlermeldung – MaxouMask

+0

Es funktionierte großartig, können Sie eine Begründung für diese Antwort oder ein Problem bieten. –

6

Dieses Problem, indem Sie „makemigrations“ für alle enthalten ist Apps, die noch nicht migriert wurden, dh Apps, die noch keine Datei "initial_0001.py" in ihrem Migrationsverzeichnis haben.

Dies geschieht (in unserem Fall verwenden wir eine Make-Datei), indem für jede dieser Anwendungen ausgeführt werden:

manage.py makemigrations app_name 

Sobald das erledigt ist, können Sie ausführen:

manage.py migrate 

wie üblich.

Die zugrunde liegende Ursache dafür ist, dass

aus irgendeinem Grund
manage.py makemigrations 

tut nicht immer diese ersten Migrationen schaffen, wenn sie nicht bereits vorhanden sind. Und das führt zu dem erwähnten Fehler.

Im Gegenteil,

manage.py makemigrations app_name 

hat sie immer schaffen (wenn nicht bereits vorhanden). Leider kann ich die Gründe für diese Asymmetrie nicht ergründen.

+0

In welchem ​​Verzeichnis führen Sie den Befehl aus? Ich erhalte den Fehler "Kann Datei manage.py nicht öffnen". –

+1

Sie sollten diesen Befehl in dem Verzeichnis ausführen, das die Datei "manage.py" enthält. Sie können die folgenden 2 Alternativen versuchen: 1) den Befehl mit dem Punkt-Schrägstrich voranstellen, so: "./manage.py makemigrations" oder 2) mit der Python-Programmdatei voranstellen, so: "python manage.py makemigrations". Viel Glück. –

+0

Aber wo ist das? –

0

Ich habe ein altes Django 1.6-Projekt nach Django 1.8 migriert und zuvor haben wir syncdb verwendet, um die Datenbank zu migrieren, und wir haben für alle Apps in unserem Projekt keine ersten Migrationsschritte. Mit Django 1.8 benötigen Sie eine funktionierende Datenbankmigration. Running

manage.py makemigrations <app_name> 

für alle Apps in unserem Projekt behoben unsere Probleme.

0

Vielleicht haben Sie die Antwort gefunden und das Problem gelöst, aber ich wollte darauf hinweisen, dass in meinem Fall das obige Problem gelöst wurde, indem die Datenbank gelöscht und mit den vollen Rechten der Benutzer neu erstellt wurde . Ich konnte dies tun, weil ich an einer Nicht-Produktionsumgebung arbeite, aber dies in einer Staging-Umgebung zu tun, ist keine gute Idee, also sei vorsichtig.

Im python 2.7.12 und nach Verwendung sind die Spezifikationen meines virtualenv:

Django==1.10.5 
django-crispy-forms==1.6.1 
django-registration-redux==1.4 
djangorestframework==3.5.3 
olefile==0.44 
packaging==16.8 
Pillow==4.0.0 
psycopg2==2.6.2 
+0

Vielen Dank "Cavpollo" für die Korrektur. es sieht definitiv besser aus. –

+0

Das Löschen und Wiederherstellen der Datenbank war das einzige, was für mich funktionierte. Danach habe ich python manage.py migrieren, dann wurde das Problem behoben. Alles, was ich danach tun musste, war, einen weiteren Superuser zu erstellen. – DevBot