Django dump des données pour un seul modèle?

144

Puis-je effectuer un dumpdatadans Django sur un seul modèle, plutôt que sur toute l'application, et si oui, comment?

Pour une application, ce serait:

python manage.py dumpdata myapp

Cependant, je veux qu'un modèle spécifique, tel que "myapp.mymodel" soit vidé. La raison en est que j'ai d'énormes, 3 millions d'enregistrements plus, des ensembles de données dans la même application que je n'aimerais pas vider.

bonne
la source
1
Je trouve votre question difficile à comprendre. Vous souhaitez charger un vidage SQL dans votre base de données? Ou vous voulez faire une sorte de toString () sur une instance d'un modèle?
Leonard Ehrenfried

Réponses:

245

À partir de la version 1.1 et supérieure, la dumpdatacommande de gestion Django vous permet de vider les données de tables individuelles:

./manage.py dumpdata myapp1 myapp2.my_model

Vous pouvez également séparer plusieurs applications et modèles sur la ligne de commande. Voici la définition canonique:

django-admin dumpdata [app_label[.ModelName] [app_label[.ModelName] ...]]
simplement
la source
17
gath, n'a pas compris le vote négatif sur le poste qui a presque 2 ans. De plus, le code ci-dessus fonctionnait bien même avec la v1.1. Les nouvelles fonctionnalités des nouvelles versions n'invalident pas les anciennes réponses.
Simplyharsh
1
Et comment ajouter ces données à une autre instance de l'application?.
aguilarpgc
1
Pour rendre json lisible par l'homme, utilisez le drapeau --indent 4aprèsdumpdata
Valery Ramusik
103

Comme indiqué, vous ne pouvez pas le faire via une commande manage.py dans Django 1.0. Cependant, vous pouvez utiliser un script pour exporter le fichier JSON et le charger en utilisant 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
la source
4
C'est un excellent script car vous pouvez obtenir encore plus de précision si vous le souhaitez. Si vous faites plutôt un .filter (...) sur la ligne trois ci-dessus, vous pouvez vider uniquement les enregistrements spécifiques que vous souhaitez.
Gringo Suave
1
Agréable! Un contrôle nettement plus fin de cette façon.
Luis Artola
9

Prenez toutes les données au format json à partir du modèle django.

Syntaxe:

python manage.py dumpdata app_name.model_name

Par exemple, vider les données du modèle group_permission qui résident dans l'application d'authentification par défaut dans django.

python manage.py dumpdata auth.group_permission

Pour la sortie, jetez un œil sur la console .

Shubho Shaha
la source
6

Je pense que vous aviez la solution dans votre question. Vous pouvez vider un modèle individuel comme ceci:

./manage.py dumpdata myapp.my_model
Harold
la source
je l'ai essayé avant de poster. eu aucune chance. je suis dans django 1.0. également essayé myapp.models.mymodel?
nategood le
4

Pour réussir, j'ai dû le dire deux fois, et spécifier le modèle deux fois, comme:

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

Si seulement je disais

./manage.py dumpdata myapp2 myapp2.my_model

J'ai été inondé de tous les modèles de myapp2, malgré le fait que j'ai spécifié my_model.

Csaba Toth
la source
1

Pour contourner ce problème, vous pouvez créer une autre application et copier le modèle, mais le pointer vers la table existante avec l'option méta db_table. Ensuite, vous pouvez simplement vider les modèles que vous avez copiés dans la nouvelle application. Votre application existante ne serait pas affectée.

Codes Ogre
la source
1

J'ai créé une commande de gestion pour générer un appareil par modèle. Les projecteurs peuvent être générés en exécutant:

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

code sur: https://gist.github.com/2394883

Jonas Geiregat
la source
1

Pour l'écrire sur un fichier spécifique:

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