Ich habe Probleme beim Laden von Django-Fixtures in meine MySQL-Datenbank aufgrund von Konflikten mit Inhaltstypen. Zuerst habe ich versucht, die Daten nur von meiner App wie folgt zu sichern:
./manage.py dumpdata escola > fixture.json
Es fehlten jedoch immer wieder Probleme mit Fremdschlüsseln, da meine App "escola" Tabellen aus anderen Anwendungen verwendet. Ich habe weitere Apps hinzugefügt, bis ich dazu kam:
./manage.py dumpdata contenttypes auth escola > fixture.json
Das Problem ist nun die folgende Einschränkungsverletzung, wenn ich versuche, die Daten als Testgerät zu laden:
IntegrityError: (1062, "Duplicate entry 'escola-t23aluno' for key 2")
Es scheint, dass das Problem darin besteht, dass Django versucht, Inhaltstypen mit verschiedenen Primärschlüsselwerten, die mit den Primärschlüsselwerten des Geräts in Konflikt stehen, dynamisch neu zu erstellen. Dies scheint der gleiche zu sein wie der hier dokumentierte Fehler: http://code.djangoproject.com/ticket/7052
Das Problem ist, dass die empfohlene Problemumgehung darin besteht, die Contenttypes-App zu sichern, die ich bereits mache!? Was gibt? Wenn es einen Unterschied macht, habe ich einige benutzerdefinierte Modellberechtigungen, wie hier dokumentiert: http://docs.djangoproject.com/de/dev/ref/models/options/#permissions
-e contenttypes -e auth.permission
mit verwenden--natural
? Ich habe es nur ohne die--natural
Option versucht und es hat funktioniert. Auch die Dokumentation hier sagt, dass man diese Option verwenden sollte, wenn DUMPINGauth.permission
undcontenttypes
.ContentType
undPermission
nicht garantiert werden, dass sie die gleiche ID wie zuvor erhalten. Ihr Datendump enthält IDs, die möglicherweise auf verschiedene Objekte in einer anderen Datenbank verweisen, in die Sie Daten laden. Dies könnte aus einem der folgenden Gründe für Sie funktionieren: 1) Ihre Daten hatten keinen Verweis auf diese Objekte. 2) Die ursprünglichen IDs von Permission / ContentTypes wurden beibehalten. 3) Ihre Ladedaten waren erfolgreich, aber Sie haben tatsächlich beschädigte Daten aufgrund von Objekten unter Bezugnahme auf falsche Objekte und Sie wissen noch nichts darüber--natural
ist jetzt zugunsten von--natural-foreign
(und--natural-primary
) veraltetmanage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4 > project_dump.json
--natural
wurde jetzt komplett entfernt, nicht nur veraltet. Verwenden Sie--natural-foreign
oder--natural-primary
stattdessen.Ja, das ist wirklich irritierend. Eine Weile habe ich es umgangen, indem ich vor dem Laden des Fixtures ein "manage.py reset" für die Contenttypes-App durchgeführt habe (um die automatisch generierten Contenttypes-Daten zu entfernen, die sich von der gedumpten Version unterschieden). Das hat funktioniert, aber irgendwann habe ich die Probleme satt und die Fixtures ganz zugunsten von reinen SQL-Dumps aufgegeben (dann verlieren Sie natürlich die DB-Portabilität).
Update - Die beste Antwort ist, das
--natural
Flag zu verwendendumpdata
, wie in einer Antwort unten angegeben. Diese Flagge existierte noch nicht, als ich diese Antwort schrieb.quelle
Versuchen Sie, beim Erstellen eines Geräts Inhaltstypen zu überspringen:
Es hat bei mir in einer ähnlichen Situation für Unit-Tests funktioniert, Ihr Einblick in die Inhaltstypen hat wirklich geholfen!
quelle
Die Antworten hier sind alle alt ... Ab 2017 ist die beste Antwort:
quelle
Ich habe nicht MySQL verwendet, sondern einige Daten von einem Live-Server in SQLite importiert. Das Löschen der
contenttypes
App-Daten vor dem Ausführenloaddata
hat den folgenden Trick ausgeführt:Und dann
quelle
Ich habe dieses Problem in meinen Testfällen behoben, indem ich die Contenttypes-App vor dem Laden meiner Dump-Datei aus dem Unit-Test zurückgesetzt habe. Carl schlug dies bereits mit dem
manage.py
Befehl vor und ich mache dasselbe nur mit dercall_command
Methode:Mein
full_test_data.json
Gerät enthält den Content-Typ-App-Dump, der den restlichen Testdaten entspricht. Durch Zurücksetzen der App vor dem Laden wird der doppelte Schlüssel verhindertIntegrityError
.quelle
Das funktioniert bei mir. Hier schließe ich alles aus, was den eigentlichen Modellen entspricht.
quelle
Sie müssen natürliche Schlüssel verwenden, um jeden Fremdschlüssel und viele-zu-viele-Beziehungen darzustellen. Darüber hinaus ist es möglicherweise eine gute Idee, die
session
Tabelle in dersessions
App und dielogentry
Tabelle in deradmin
App auszuschließen .Django 1.7+
Django <1,7
Gemäß der Dokumentation Django ,
--natural
wurde in der Version 1.7, veraltet , so dass die Option--natural-foreign
sollte stattdessen verwendet werden.Sie können den Primärschlüssel auch in den serialisierten Daten dieses Objekts weglassen, da er während der Deserialisierung durch Übergeben des
--natural-primary
Flags berechnet werden kann .quelle
wird sich verändern
zu
Und das Gerät funktioniert
TestCase
vorerstquelle
Django 2.2.5
Es hat mir geholfen
quelle
Ich werde eine andere mögliche Antwort geben, die ich gerade herausgefunden habe. Vielleicht hilft es dem OP, vielleicht hilft es jemand anderem.
Ich habe eine Viele-zu-Viele-Beziehungstabelle. Es hat einen Primärschlüssel und die beiden Fremdschlüssel zu den anderen Tabellen. Ich habe festgestellt, dass ein Eintrag im Gerät, dessen zwei Fremdschlüssel mit einem anderen Eintrag in der Tabelle mit einem anderen Paket identisch sind, fehlschlägt. M2M-Beziehungstabellen haben ein "eindeutiges Zusammen" für die beiden Fremdschlüssel.
Wenn es sich also um eine M2M-Beziehung handelt, die unterbrochen wird, überprüfen Sie die hinzugefügten Fremdschlüssel und sehen Sie in Ihrer Datenbank nach, ob dieses FK-Paar bereits unter einer anderen PK aufgeführt ist.
quelle
Es ist wirklich sehr, sehr nervig. Ich werde jedes Mal davon gebissen.
Ich habe versucht, Daten mit --exclude contenttypes und --natural zu sichern, ich bekomme immer Probleme ..
Was für mich am besten funktioniert, ist einfach eine
truncate table django_content_type;
nach der Synchronisierung durchzuführen und dann die Daten zu laden.Natürlich sind Sie für das automatische Laden von initial_data.json Fallball.
quelle
Ich hatte vor manchmal einen ähnlichen Fehler festgestellt. Es stellte sich heraus, dass ich versuchte, die Fixtures zu laden, bevor ich die erforderlichen Tabellen erstellte. So tat ich:
Und es hat wie ein Zauber funktioniert
quelle
In meinem Fall hatte ich die Daten von
auth
(./manage.py dumpddata auth > fixtures/auth.json
) ausgegeben, um das Gerät zu Testzwecken zu verwenden.Die Entwicklung wurde fortgesetzt und ich entfernte die meisten Modelle, in denen ich definiert hatte,
models.py
und zu diesem Zeitpunkt bemerkte ich dieses ärgerliche Problem.Meine Lösung bestand darin, das auth.json-Gerät erneut zu generieren. Dieser hatte viele Einträge entfernt
auth.permission
, die sich auf die alten Modelle bezogen, die ich hatte.quelle
Ich habe jede Methode von oben ausprobiert. Nichts hat bei mir funktioniert. Ich muss das komplette Auth-Modell ausschließen und funktioniert einwandfrei.
quelle