Django 1.7 - Auswanderungen, die keine Veränderungen erkennen


140

Wie der Titel schon sagt, kann ich Migrationen scheinbar nicht zum Laufen bringen.

Die App war ursprünglich unter 1.6, daher verstehe ich, dass Migrationen anfangs nicht vorhanden sind. Wenn ich sie ausführe, python manage.py migratebekomme ich:

Operations to perform:
  Synchronize unmigrated apps: myapp
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Running migrations:
  No migrations to apply.

Wenn ich Änderungen an einem Modell in myappvornehme, heißt es immer noch, wie erwartet, nicht migriert.

Aber wenn ich renne, python manage.py makemigrations myappbekomme ich:

No changes detected in app 'myapp'

Es scheint nicht wichtig zu sein, was oder wie ich den Befehl ausführe, es erkennt niemals, dass die App Änderungen aufweist, und es werden auch keine Migrationsdateien zur App hinzugefügt.

Gibt es eine Möglichkeit, eine App für Migrationen zu erzwingen und im Wesentlichen zu sagen, dass dies meine Basis ist, mit der ich arbeiten kann, oder so? Oder fehlt mir etwas?

Meine Datenbank ist eine PostgreSQL-Datenbank, wenn das überhaupt hilft.


Die angebotenen Lösungen haben bei mir nicht funktioniert. Hier ist meine Lösung, wenn jemand vor dem gleichen Problem steht! 1. Löschen Sie Migrationsdateien unter allen Apps. 2. Löschen Sie die Datenbank und erstellen Sie sie erneut. 3. Führen Sie makemigrations aus und migrieren Sie die Befehle. PS Versuchen Sie zuerst Schritt 1 und 3. Wenn immer noch ein Fehler auftritt, führen Sie die Schritte 1 bis 3 aus.
Amoroso

Antworten:


187

Wenn Sie von einer vorhandenen App wechseln, die Sie in Django 1.6 erstellt haben, müssen Sie einen in der Dokumentation aufgeführten Vorschritt (wie ich herausgefunden habe) ausführen:

python manage.py makemigrations your_app_label

Die Dokumentation macht nicht deutlich, dass Sie dem Befehl die App-Bezeichnung hinzufügen müssen, da Sie als Erstes aufgefordert werden, python manage.py makemigrationsdas zu tun, was fehlschlägt. Die anfängliche Migration erfolgt, wenn Sie Ihre App in Version 1.7 erstellen. Wenn Sie jedoch aus 1.6 stammen, wurde sie nicht ausgeführt. Siehe die ‚Hinzufügen von Migration auf Apps‘ in der Dokumentation für weitere Details.


1
Schöne Antwort für Leute aus Django 1.6! Vielen Dank!
David D.

1
Was ist, wenn ich viel mehr als eine App habe? Sollte ich python manage.py makemigrations APP_LABELfür jeden müssen?
Alston

1
Unter Django 1.9 hier und meine App wurde mit erstellt ./manage.py startapp, aber ich musste noch explizit das Label erwähnen
maxbellec

50

Dies kann folgende Gründe haben:

  1. Sie haben die App in der INSTALLED_APPSListe in nicht hinzugefügt settings.py (Sie müssen entweder den App-Namen oder den gepunkteten Pfad zur Unterklasse von AppConfig in apps.py im App-Ordner hinzufügen, abhängig von der verwendeten Django-Version). Siehe Dokumentation: INSTALLED_APPS
  2. Sie haben keinen migrationsOrdner in diesen Apps. (Lösung: Erstellen Sie einfach diesen Ordner).
  3. Sie haben keine __init__.pyDatei im migrationsOrdner dieser Apps. (Lösung: Erstellen Sie einfach eine leere Datei mit dem Namen __init__.py )
  4. Sie haben keine __init__.pyDatei im App-Ordner. (Lösung: Erstellen Sie einfach eine leere Datei mit dem Namen __init__.py )
  5. Sie haben keine models.pyDatei in der App
  6. Ihre Python-Klasse (soll ein Modell sein) in models.pyerbt nichtdjango.db.models.Model
  7. Sie haben einen semantischen Fehler bei der Definition von Modellen in models.py

Hinweis: Ein häufiger Fehler ist das Hinzufügen eines migrationsOrdners zur .gitignoreDatei. Beim Klonen aus dem Remote-Repo fehlen migrationsOrdner und / oder __init__.pyDateien im lokalen Repo. Dies verursacht ein Problem.

Ich schlage vor, Migrationsdateien durch Hinzufügen der folgenden Zeilen zur .gitignoreDatei zu gitignore

*/migrations/*
!*/migrations/__init__.py

1
Ich hatte mein Projekt geklont und der Migrationsordner wurde nicht in das Repo verschoben, sodass ich den Migrationsdirektor hinzufügen musste. Dann fügte ich die init .py hinzu und konnte Migrationen durchführen. Vielen Dank an Sie
Junaid

Ich habe den Inhalt meines Ordners / migrations gelöscht, um Dinge in einem Projekt zurückzusetzen, das ich noch nicht bereitgestellt hatte. Ich habe versehentlich den __init__.pyOrdner zusammen mit den Migrationen gelöscht .
Seth

Dies hat es für mich getan ... You don't have __init__.py file inside migrations folder of those apps. (Solution: Just create an empty file with name __init__.py)und es wurde durch Hinzufügen der Dateien zu.gitignore
lukik

1
Warum ist die init .py-Datei im Migrationsordner so wichtig? Wo kann ich tiefer nach dieser Logik suchen?
Nimish Bansal

1
@NimishBansal Bis Python 3.3- __init__.pyDatei ist in einem Verzeichnis erforderlich, damit sie als Python-Paket behandelt wird. siehe dies
Mohammed Shareef C

29

Ok, es sieht so aus, als hätte ich einen offensichtlichen Schritt verpasst, aber dies zu posten, falls jemand anderes das Gleiche tut.

Beim Upgrade auf 1.7 wurden meine Modelle nicht mehr verwaltet ( managed = False) - ich hatte sie wie Truezuvor, aber es scheint, dass sie zurückgesetzt wurden.

Durch Entfernen dieser Zeile (standardmäßig True) und makemigrationssofortiges Ausführen wurde ein Migrationsmodul erstellt, und jetzt funktioniert es. makemigrationsfunktioniert nicht bei nicht verwalteten Tabellen (was im Nachhinein offensichtlich ist)


4
Bitte klären Sie, wo Sie "verwaltet = falsch" geändert / hinzugefügt haben. Ich habe das gleiche Problem
Ycon

1
Ich habe diesen Code nicht mehr, aber ich denke als eine Eigenschaft der Klasse, wenn ich mich richtig erinnere.
TyrantWave

1
Guter Punkt. Beachten Sie, dass manage.py inspectdbmanage = False! Wenn Sie ältere Datenbanken importieren, müssen Sie diese sorgfältig optimieren!
Alessandro Dentella

@ TyrantWave, du hast meinen Tag gerettet. Vielen Dank.
Utkarsh Sharma

app_label
Stellen Sie

19

Meine Lösung wurde hier nicht behandelt, daher poste ich sie. Ich hatte es syncdbfür ein Projekt verwendet - nur um es zum Laufen zu bringen. Als ich dann versuchte, Django-Migrationen zu verwenden, fälschte es sie zuerst und sagte dann, es sei "OK", aber mit der Datenbank passierte nichts.

Meine Lösung bestand darin, einfach alle Migrationsdateien für meine App sowie die Datenbankeinträge für die App-Migrationen in der django_migrationsTabelle zu löschen .

Dann habe ich gerade eine erste Migration durchgeführt mit:

./manage.py makemigrations my_app

gefolgt von:

./manage.py migrate my_app

Jetzt kann ich problemlos Migrationen durchführen.


Zu Ihrer Information: Es ist wichtig, dass er hier sagt: "Die Dateien sowie die Datenbankeinträge." Wenn Sie die Datenbankeinträge entfernen, aber nicht auch die Dateien (außer __init.py__, es wird nicht funktionieren.
Mike Robinson

15

Stimmen Sie mit @furins überein. Wenn alles in Ordnung zu sein scheint und dieses Problem dennoch auftritt, überprüfen Sie, ob es eine Eigenschaftsmethode mit demselben Titel wie das Attribut gibt, das Sie der Model-Klasse hinzufügen möchten.

  1. Entfernen Sie die Methode mit dem ähnlichen Namen wie das Attribut, das Sie hinzufügen.
  2. manage.py makemigrations my_app
  3. manage.py migriere my_app
  4. Fügen Sie die Methoden wieder hinzu.

11

Dies ist ein dummer Fehler, aber ein zusätzliches Komma am Ende der Felddeklarationszeile in der Modellklasse hat keine Auswirkung auf die Zeile.

Es passiert, wenn Sie kopieren und die def einfügen. aus der Migration, die selbst als Array definiert ist.

Obwohl das vielleicht jemandem helfen würde :-)


1
Ihr Kommentar hat mir geholfen, mein Problem zu finden! Ich hatte am Ende der letzten Auswahl in einer Auswahlliste kein Komma. Anscheinend ist Django sehr empfindlich.
Maxim

1
@ Maxim: Das war wahrscheinlich nicht die Ursache Ihres Problems: Eine Liste ohne Komma am Ende ist immer noch eine Liste. Eine andere Sache sind Tupel: Wenn Sie nur 1 Element in einem Tupel haben, benötigen Sie danach ein Komma.
blueFast

Alter, der mir viel Zeit gespart hat! @dangonfast: In der Modelldefinition ist es in der Tat ein Problem.
MrE

11

Vielleicht bin ich zu spät, aber haben Sie versucht, einen migrationsOrdner mit einer __init__.pyDatei in Ihrer App zu haben ?


1
Wenn Sie diese "Makemigrationen" haben, werden die Migrationen für die App erstellt. Andernfalls müssen Sie makemigrations app_name ausführen (wodurch diese Datei erstellt wird)
Scott Warren

7

Vielleicht hilft das jemandem. Ich habe eine verschachtelte App verwendet. project.appname und ich hatten tatsächlich project und project.appname in INSTALLED_APPS. Durch das Entfernen des Projekts aus INSTALLED_APPS konnten die Änderungen erkannt werden.


7

Die Antwort finden Sie in diesem Stackoverflow-Beitrag von cdvv7788 Migrations in Django 1.7

Wenn Sie diese App zum ersten Mal migrieren, müssen Sie Folgendes verwenden:

manage.py makemigrations myappname Sobald Sie dies getan haben, können Sie Folgendes tun:

manage.py migrate Wenn Sie Ihre App in der Datenbank hatten, ihr Modell geändert haben und die Änderungen bei Makemigrationen nicht aktualisiert haben, haben Sie sie wahrscheinlich noch nicht migriert. Ändern Sie Ihr Modell wieder in seine ursprüngliche Form, führen Sie den ersten Befehl (mit dem App-Namen) aus und migrieren Sie ... es wird gefälscht. Sobald Sie dies getan haben, setzen Sie die Änderungen an Ihrem Modell zurück, führen Sie makemigrations aus und migrieren Sie erneut, und es sollte funktionieren.

Ich hatte genau die gleichen Probleme und das oben genannte funktionierte perfekt.

Ich hatte meine Django-App auf Cloud9 verschoben und aus irgendeinem Grund die anfängliche Migration nie mitbekommen.


7

Folgendes hat bei mir funktioniert:

  1. Fügen Sie den App-Namen zu settings.py hinzu
  2. Verwenden Sie 'python manage.py makemigrations'
  3. Verwenden Sie 'python manage.py migrate'.

Arbeitete für mich: Python 3.4, Django 1.10


6

Leute wie ich, die keine Migrationen mögen, können die folgenden Schritte ausführen.

  1. Entfernen Sie die Änderungen, die Sie synchronisieren möchten.
  2. Führen Sie python manage.py makemigrations app_labelfür die erste Migration.
  3. Führen Sie diese python manage.py migrateaus, um Tabellen zu erstellen, bevor Sie Änderungen vornehmen.
  4. Fügen Sie Änderungen ein, die Sie im ersten Schritt entfernen.
  5. Führen Sie die Schritte 2. und 3. aus.

Wenn Sie einen dieser Schritte verwechselt haben, lesen Sie die Migrationsdateien. Ändern Sie sie, um Ihr Schema zu korrigieren oder unerwünschte Dateien zu entfernen, aber vergessen Sie nicht, den Abhängigkeitsteil der nächsten Migrationsdatei zu ändern;)

Ich hoffe, dass dies in Zukunft jemandem helfen wird.


5

Sie möchten das settings.pyin der INSTALLED_APPSListe überprüfen und sicherstellen, dass alle Apps mit Modellen dort aufgelistet sind.

Wenn Sie makemigrationsim Projektordner ausgeführt werden, werden alle Tabellen aktualisiert, die sich auf alle settings.pyfür das Projekt enthaltenen Apps beziehen . Sobald Sie es hinzugefügt haben, makemigrationswird die App automatisch eingeschlossen (dies spart viel Arbeit, sodass Sie nicht makemigrations app_namefür jede App in Ihrem Projekt / Ihrer Site ausgeführt werden müssen).


5

Nur für den Fall, dass Sie ein bestimmtes Feld haben, das nicht durch Makemigrationen identifiziert wird: Überprüfen Sie zweimal, ob Sie eine Eigenschaft mit demselben Namen haben.

Beispiel:

field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)

# ... later

@property
def field(self):
    pass

Die Eigenschaft "überschreibt" die Felddefinition, sodass Änderungen nicht durch identifiziert werden makemigrations


Ein verwandter Fehler ist, ein fehlerhaftes Feld zu haben, das der Validierung / Überprüfung immer noch entgeht. Ich habe definiert hourly_rate = models.DecimalField(das nachfolgende '()' fehlt) und es ist einfach lautlos fehlgeschlagen.
Salbei

5

Stellen Sie sicher, dass Ihr Modell nicht ist abstract. Ich habe diesen Fehler tatsächlich gemacht und es hat eine Weile gedauert, also dachte ich, ich würde ihn posten.


4

Diese Antwort hinzufügen, weil mir nur diese Methode geholfen hat.

Ich habe den migrationsOrdner run makemigrationsund gelöscht migrate.
Es hieß immer noch: Keine Migrationen zu beantragen.

Ich ging zum migrateOrdner und öffnete die zuletzt erstellte Datei,
kommentierte die gewünschte Migration (sie wurde erkannt und dort eingegeben)
und führte sie migrateerneut aus.

Dadurch wird die Migrationsdatei grundsätzlich manuell bearbeitet.
Tun Sie dies nur, wenn Sie den Dateiinhalt verstehen.


1
Ich danke dir sehr! Dies half
Sharpless512

3

Haben Sie schemamigration my_app --initialnach dem Umbenennen des alten Migrationsordners verwendet? Versuch es. Könnte funktionieren. Wenn nicht, versuchen Sie, die Datenbank neu zu erstellen und syncdb + migrieren zu lassen. Es hat bei mir funktioniert ...


10
Es schemamigrationgibt keinen Befehl - ich denke, das ist ein Teil des Südens? Ich habe derzeit überhaupt keinen Migrationsordner. Das Entfernen models.pyund erneutes Ausführen inspectdbschien nichts zu bewirken .
TyrantWave

2
schemamigrationwar aus dem Süden. makemigrationsist sein Ersatz.
Craig Labenz

2
Dies ist noch gültig. Aber es änderte sich zumakemigrations --empty
Iulius Curt

2

Hatte das gleiche Problem Stellen Sie sicher, dass alle Klassen, die Sie in models.py definiert haben, die Datei models.Model erben müssen.

class Product(models.Model):
    title = models.TextField()
    description = models.TextField()
    price = models.TextField()

1

Ich hatte das gleiche Problem damit, zweimal Auswanderungen durchführen zu müssen und alle möglichen seltsamen Verhaltensweisen. Es stellte sich heraus, dass die Ursache des Problems darin bestand, dass ich eine Funktion zum Festlegen von Standarddaten in meinen Modellen verwendete, sodass Migrationen bei jeder Ausführung von Makemigrationen eine Änderung feststellten. Die Antwort auf diese Frage hat mich auf den richtigen Weg gebracht: Vermeiden Sie Auswanderungen, um das Datumsfeld neu zu erstellen


1

Ich habe kürzlich Django von 1.6 auf 1.8 aktualisiert und hatte nur wenige Apps und Migrationen für sie. Ich habe den Süden verwendet und schemamigrationsMigrationen in Django 1.6 erstellt, das in Django 1.8 gelöscht wird.

Als ich nach dem Upgrade neue Modelle hinzufügte, makemigrationserkannte der Befehl keine Änderungen. Und dann habe ich die von @drojf vorgeschlagene Lösung ausprobiert (1. Antwort), sie hat gut funktioniert, aber keine gefälschte anfängliche Migration angewendet ( python manage.py --fake-initial). Ich habe dies getan, da meine Tabellen (alte Tabellen) bereits erstellt wurden.

Schließlich funktionierte dies für mich, entfernte neue Modelle (oder Modelländerungen) aus models.py und musste dann den Migrationsordner aller Apps löschen (oder zur Sicherheitssicherung umbenennen) und Python- manage.pyMakemigrationen für alle Apps ausführen python manage.py migrate --fake-initial. Das hat wie ein Zauber gewirkt. Sobald die anfängliche Migration für alle Apps erstellt und die gefälschte anfängliche Migration durchgeführt wurde, wurden neue Modelle hinzugefügt und der reguläre Prozess makemigrationsund die Migration dieser App befolgt . Die Änderungen wurden jetzt erkannt und alles ging gut.

Ich habe gerade daran gedacht, es hier zu teilen. Wenn jemand das gleiche Problem hat ( schemamigrationsvon Süden für seine Apps), könnte es ihm helfen :)


1

Vielleicht kann das jemandem helfen, ich hatte das gleiche Problem.

Ich habe bereits zwei Tabellen mit der Serializer-Klasse und den Ansichten erstellt. Als ich also aktualisieren wollte, hatte ich diesen Fehler.

Ich habe diese Schritte befolgt:

  1. ich machte .\manage.py makemigrations app
  2. Ich habe ausgeführt .\manage.py migrate
  3. Ich habe beide Tabellen von mir gelöscht models.py
  4. Ich habe alle Verweise auf meine Tabellen aus dem Serializer und der View-Klasse gelöscht.
  5. Ich habe Schritt 1und ausgeführt 2.
  6. Ich habe meine Änderungen nur in der abgerufen models.py
  7. Ich habe wieder Schritt ausgeführt 5.
  8. Ich habe alle meine Änderungen wiederhergestellt.

Wenn Sie mit Pycharm arbeiten, ist die lokale Geschichte sehr hilfreich.


1

Vielleicht hilft das jemandem.

Ich habe meine gelöscht models.pyund erwartet makemigrations, DeleteModelAnweisungen zu erstellen .

Denken Sie daran, *.pycDateien zu löschen !


1
./manage makemigrations
./manage migrate

Migrationen verfolgen Änderungen an der Datenbank. Wenn Sie also von nicht verwaltet zu verwaltet wechseln, müssen Sie sicherstellen, dass Ihre Datenbanktabelle in Bezug auf das Modell, mit dem Sie sich befassen, auf dem neuesten Stand ist.

Wenn Sie sich noch im Entwicklungsmodus befinden, habe ich persönlich beschlossen, die Migrationsdateien in meiner IDE sowie in der Tabelle django_migrations zu meinem Modell zu löschen und den obigen Befehl erneut auszuführen.

ERINNERN SIE SICH: Wenn Sie eine Migration haben, die mit _001 in Ihrer IDE und _003 in Ihrer Datenbank endet. Django wird nur sehen, ob eine Migration mit _004 endet, damit etwas aktualisiert werden kann.

Die 2 (Code & DB-Migrationen) sind verknüpft und arbeiten zusammen.

Viel Spaß beim Codieren.


1
  1. Entfernen Sie die Änderungen, die Sie synchronisieren möchten.
  2. Führen Sie python manage.py makemigrations app_label für die anfängliche Migration aus.
  3. Führen Sie python manage.py migrate aus, um Tabellen zu erstellen, bevor Sie Änderungen vornehmen.
  4. Fügen Sie Änderungen ein, die Sie im ersten Schritt entfernen.
  5. Führen Sie die Schritte 2. und 3. aus

0

Diese Antwort wurde hinzugefügt, da keine der oben verfügbaren Antworten für mich funktioniert hat.

In meinem Fall passierte etwas noch Seltsameres ( Django 1.7 Version ). In meiner models.py hatte ich eine "zusätzliche" Zeile am Ende meiner Datei (es war eine leere Zeile) und als ich den python manage.py makemigrationsBefehl ausführte, war das Ergebnis: "Keine Änderungen erkannt".

Um dies zu beheben, habe ich diese "leere Zeile" gelöscht , die sich am Ende meiner Datei models.py befand , und den Befehl erneut ausgeführt. Alles wurde behoben und alle an models.py vorgenommenen Änderungen wurden erkannt!


Nun, in Django 2.0 + ist diese leere Zeile erforderlich, glaube ich, ich musste das Gegenteil von dem tun, was du getan hast, Kumpel
Sumit Kumar Saha

@SumitKumarSaha haha ​​Ich verwende derzeit die Version Django 1.7 und diese leere Zeile war der Grund dafür, dass 2 Stunden lang alles versucht wurde, um den Migrationsfehler zu beheben. Danke, dass du Sumit geteilt hast. Einen schönen Tag noch
Huskie

0

Möglicherweise müssen Sie die ersten Migrationen mit dem folgenden Befehl vortäuschen

python manage.py migrate --fake-initial

0

Erstens ist diese Lösung auf diejenigen anwendbar, bei denen während der Bereitstellung auf dem Heroku-Server dasselbe Problem auftritt. Ich hatte dasselbe Problem.

Für die Bereitstellung ist ein obligatorischer Schritt erforderlich: Hinzufügen von django_heroku.settings (local ()) in der Datei settings.py.

Änderungen: Als ich die obige Zeile in django_heroku.settings (local (), database = False) geändert habe, hat es einwandfrei funktioniert.


0

In meinem Fall musste ich mein Modell zur Datei _ init _.py des Modellordners hinzufügen, in dem mein Modell definiert wurde:

from myapp.models.mymodel import MyModel

-1

Hinzufügen meiner 2c, da keine dieser Lösungen für mich funktionierte, aber dies tat ...

Ich hatte gerade manage.py squashmigrationsdie alten Migrationen ausgeführt und entfernt (sowohl die Dateien als auch die Zeilen in der Datenbanktabelle django.migrations).

Dies hat in der letzten Migrationsdatei eine Zeile wie diese hinterlassen:

replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]

Dies verwirrte Django anscheinend und verursachte seltsames Verhalten: Durch Ausführen wurde manage.py makemigrations my_appdie anfängliche Migration neu erstellt, als ob keine vorhanden wäre. Das Entfernen der replaces...Leitung hat das Problem behoben!


-1

python manage.py makemigrations-Konten Migrationen für 'Konten': Konten \ Migrationen \ 0001_initial.py - Modell erstellen Kunde - Modell erstellen Tag - Modell erstellen Produkt - Modell erstellen Bestellung

Hinweis: Hier ist "Konten" mein App-Name

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.