donc en supposant que votre models.py
ressemble à quelque chose comme ceci:
class Representative(models.Model):
parliament = models.CharField(max_length=128)
name = models.CharField(max_length=128)
country = models.CharField(max_length=128)
party_group = models.CharField(max_length=128)
national_party = models.CharField(max_length=128)
position = models.CharField(max_length=128)
Vous pouvez ensuite exécuter python manage.py shell
et exécutez la commande suivante:
import csv
from your_app.models import Representative
# If you're using different field names, change this list accordingly.
# The order must also match the column order in the CSV file.
fields = ['parliament', 'name', 'country', 'party_group', 'national_party', 'position']
for row in csv.reader(open('your_file.csv')):
Representative.objects.create(**dict(zip(fields, row)))
Et vous avez terminé.
Addendum (modifier)
par la demande de Thomas, voici une explication de ce que **dict(zip(fields,row))
fait:
donc d'abord, fields
contient une liste de noms de champs que nous avons défini, et row
contient une liste de valeurs qui représente la ligne actuelle dans le fichier CSV.
fields = ['parliament', 'name', 'country', ...]
row = ['7', 'Marta Andreasen', 'United Kingdom', ...]
Qu'est-ce que zip()
fait est qu'il combine deux listes en une liste de paires d'articles dans les deux listes (comme une fermeture éclair); c'est-à-dire zip(['a','b,'c'], ['A','B','C'])
renverra [('a','A'), ('b','B'), ('c','C')]
. Dans notre cas:
>>> zip(fields, row)
[('parliament', '7'), ('name', 'Marta Andreasen'), ('country', 'United Kingdom'), ...]
La fonction dict()
convertit simplement la liste des paires dans un dictionnaire.
>>> dict(zip(fields, row))
{'parliament': '7', 'name': 'Marta Andreasen', 'country': 'United Kingdom', ...}
Le **
est un moyen de convertir un dictionnaire dans une liste d'arguments mot-clé pour une fonction. Donc function(**{'key': 'value'})
est l'équivalent de function(key='value')
. Ainsi, dans l'exemple en appelant create(**dict(zip(field, row)))
est l'équivalent de:
create(parliament='7', name='Marta Andreasen', country='United Kingdom', ...)
Hope this efface les choses.
Si vous chargez ceci dans Django, regardez certainement dans la solution d'Aram ici pour l'usage. Il profite des bits ORM de django pour vous, vous n'avez donc pas besoin de jouer directement avec le schéma. Pas grave si vous êtes à l'aise avec le schéma SQL, mais j'ai trouvé que cela facilitait beaucoup les choses. – heckj
+1; c'est beaucoup plus simple! – bernie
Merci pour la réponse Aram.J'apprends encore Python, alors pourriez-vous nous expliquer ce que fait la partie (** dict (zip (...)) de la dernière ligne? –