Django zrzuca dane dla pojedynczego modelu?

144

Czy mogę wykonać dumpdataw Django tylko jeden model, a nie całą aplikację, a jeśli tak, to w jaki sposób?

W przypadku aplikacji byłoby to:

python manage.py dumpdata myapp

Jednak chcę, aby jakiś konkretny model, taki jak „myapp.mymodel”, został zrzucony. Powodem jest to, że mam kilka ogromnych 3 milionów rekordów plus zbiory danych w tej samej aplikacji, których nie chciałbym porzucić.

nategood
źródło
1
Uważam, że twoje pytanie nie jest łatwe do zrozumienia. Chcesz załadować zrzut SQL do swojej bazy danych? A może chcesz wykonać coś w rodzaju toString () na i instancji modelu?
Leonard Ehrenfried,

Odpowiedzi:

245

Od wersji 1.1 i nowszych dumpdatapolecenie zarządzania Django umożliwia zrzucanie danych z poszczególnych tabel:

./manage.py dumpdata myapp1 myapp2.my_model

Możesz także oddzielić wiele aplikacji i modeli w wierszu poleceń. Oto definicja kanoniczna:

django-admin dumpdata [app_label[.ModelName] [app_label[.ModelName] ...]]
po prostu ostry
źródło
17
gath, nie zrozumiał negatywnego głosu na post, który ma prawie 2 lata. Ponadto powyższy kod działał dobrze nawet z wersją 1.1. Nowe funkcje w nowych wydaniach nie unieważniają starszych odpowiedzi.
Simplyharsh
1
Jak dodać te dane do innej instancji aplikacji?
aguilarpgc
1
Aby json był czytelny dla człowieka, użyj flagi --indent 4podumpdata
Valery Ramusik
103

Jak wspomniano, nie można tego zrobić za pomocą polecenia manage.py w Django 1.0. Możesz jednak użyć skryptu, aby wyeksportować plik JSON i załadować go za pomocą 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()
kochanie
źródło
4
To świetny skrypt, ponieważ możesz uzyskać jeszcze bardziej szczegółowy, jeśli chcesz. Jeśli zamiast tego zrobisz .filter (...) w trzecim wierszu powyżej, możesz zrzucić tylko określone rekordy, które chcesz.
Gringo Suave
1
Miły! Zdecydowanie lepsza kontrola w ten sposób.
Luis Artola
9

Weź wszystkie dane do formatu json z modelu django.

Składnia:

python manage.py dumpdata app_name.model_name

Na przykład zrzucanie danych z modelu group_permission, który znajduje się w domyślnej aplikacji auth w django.

python manage.py dumpdata auth.group_permission

Aby uzyskać wyjście, spójrz na konsolę .

Shubho Shaha
źródło
6

Myślę, że masz rozwiązanie w swoim pytaniu. Możesz zrzucić pojedynczy model w następujący sposób:

./manage.py dumpdata myapp.my_model
Harold
źródło
Wypróbowałem to przed wysłaniem. nie miał szczęścia. Jestem w django 1.0. wypróbowałeś także myapp.models.mymodel?
nategood
4

Aby odnieść sukces, musiałem to powiedzieć dwa razy i dwa razy określić model, na przykład:

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

Gdybym tylko powiedział

./manage.py dumpdata myapp2 myapp2.my_model

Zostałem zalany wszystkimi modelami w myapp2, mimo że określiłem my_model.

Csaba Toth
źródło
1

Aby obejść ten problem, możesz utworzyć inną aplikację i skopiować model, ale wskaż go do istniejącej tabeli za pomocą opcji meta db_table. Następnie możesz po prostu zrzucić skopiowane modele do nowej aplikacji. Nie ma to wpływu na istniejącą aplikację.

Ogre Codes
źródło
1

Stworzyłem polecenie zarządzania, które generuje osprzęt na podstawie modelu. Oprawy można generować uruchamiając:

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

kod pod adresem : https://gist.github.com/2394883

Jonas Geiregat
źródło
1

Aby zapisać to w określonym pliku:

python manage.py dumpdata app_label.ModelName app_label.ModelName2 > fixtures/specic.json
Nikko
źródło