Django-Dump-Daten für ein einzelnes Modell?

144

Kann ich eine dumpdatain Django durchführen nur ein einziges Modell und nicht die gesamte App , und wenn ja, wie?

Für eine App wäre es:

python manage.py dumpdata myapp

Ich möchte jedoch, dass ein bestimmtes Modell wie "myapp.mymodel" ausgegeben wird. Der Grund dafür ist, dass ich einige riesige Datensätze mit mehr als 3 Millionen Datensätzen in derselben App habe, die ich nicht ausgeben möchte.

nategood
quelle
1
Ich finde Ihre Frage nicht leicht zu verstehen. Sie möchten einen SQL-Dump in Ihre Datenbank laden? Oder möchten Sie eine Art toString () für eine Instanz eines Modells ausführen?
Leonard Ehrenfried

Antworten:

245

Ab Version 1.1 dumpdatakönnen Sie mit dem Django- Verwaltungsbefehl Daten aus einzelnen Tabellen sichern:

./manage.py dumpdata myapp1 myapp2.my_model

Sie können auch mehrere Apps und Modelle in der Befehlszeile trennen. Hier ist die kanonische Definition:

django-admin dumpdata [app_label[.ModelName] [app_label[.ModelName] ...]]
einfach hart
quelle
17
Gath, habe die negative Abstimmung auf dem Posten, der fast 2 Jahre alt ist, nicht verstanden. Darüber hinaus funktionierte der obige Code auch mit v1.1 einwandfrei. Neue Funktionen in neuen Versionen machen ältere Antworten nicht ungültig.
simplyharsh
1
Und wie füge ich diese Daten an einer anderen Instanz der App hinzu?
Aguilarpgc
1
Um Menschen lesbar zu machen, verwenden Sie die Flagge --indent 4nachdumpdata
Valery Ramusik
103

Wie bereits erwähnt, können Sie dies nicht über einen Befehl manage.py in Django 1.0 tun. Sie können jedoch ein Skript verwenden, um die JSON-Datei zu exportieren und sie zu laden, indem Sie loaddata:

from django.core import serializers
from myproject.myapp import models
data = serializers.serialize("json", models.MyModel.objects.all())
out = open("mymodel.json", "w")
out.write(data)
out.close()
dar
quelle
4
Dies ist ein großartiges Skript, da Sie auf Wunsch noch detaillierter werden können. Wenn Sie stattdessen einen .filter (...) in Zeile drei oben ausführen, können Sie nur die gewünschten Datensätze sichern.
Gringo Suave
1
Nett! Auf jeden Fall feinere Kontrolle auf diese Weise.
Luis Artola
9

Nehmen Sie alle Daten aus dem Django-Modell in das JSON-Format.

Syntax:

python manage.py dumpdata app_name.model_name

Zum Beispiel Daten aus group_permission Modell Dumping , die in django in Standard - Auth App befinden.

python manage.py dumpdata auth.group_permission

Für die Ausgabe schauen Sie auf die Konsole .

Shubho Shaha
quelle
6

Ich denke, Sie hatten die Lösung in Ihrer Frage. Sie können ein einzelnes Modell wie folgt ausgeben:

./manage.py dumpdata myapp.my_model
Harold
quelle
Ich habe es vor dem Posten versucht. hatte kein Glück. Ich bin in Django 1.0. auch versucht myapp.models.mymodel?
Nategood
4

Für den Erfolg musste ich es zweimal sagen und das Modell zweimal spezifizieren, wie:

./manage.py dumpdata myapp2.my_model myapp2.my_model

Wenn ich nur sagen würde

./manage.py dumpdata myapp2 myapp2.my_model

Ich wurde mit allen Modellen in myapp2 überflutet, obwohl ich my_model angegeben habe.

Csaba Toth
quelle
1

Um dieses Problem zu umgehen, können Sie eine andere App erstellen und das Modell kopieren, es jedoch mit der Metaoption db_table auf die vorhandene Tabelle verweisen. Dann können Sie einfach die Modelle, die Sie kopiert haben, in die neue App kopieren. Ihre vorhandene App wäre nicht betroffen.

Oger-Codes
quelle
1

Ich habe einen Verwaltungsbefehl erstellt, mit dem ein Gerät pro Modell generiert wird. Fixtures können durch Ausführen von:

./manage generate_fixtures app.model.MyModel --file=dump/MyModel.json

Code unter: https://gist.github.com/2394883

Jonas Geiregat
quelle
1

So schreiben Sie es in eine bestimmte Datei:

python manage.py dumpdata app_label.ModelName app_label.ModelName2 > fixtures/specic.json
Nikko
quelle