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.


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] ...]]

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()

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 .


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

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.


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.


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


1

So schreiben Sie es in eine bestimmte Datei:

python manage.py dumpdata app_label.ModelName app_label.ModelName2 > fixtures/specic.json
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.