Así que asumiendo que su models.py
se ve algo como esto:
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)
continuación, puede ejecutar python manage.py shell
y ejecute el siguiente:
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)))
Y listo.
Adición (editar)
solicitud
de Per Thomas, aquí es una explicación de lo **dict(zip(fields,row))
hace:
Así que al principio, fields
contiene una lista de nombres de campo que hemos definido, y row
contiene una lista de valores que representa la fila actual en el archivo CSV.
fields = ['parliament', 'name', 'country', ...]
row = ['7', 'Marta Andreasen', 'United Kingdom', ...]
Lo zip()
hace es que combina dos listas en una lista de pares de elementos de ambas listas (como una cremallera); es decir, zip(['a','b,'c'], ['A','B','C'])
devolverá [('a','A'), ('b','B'), ('c','C')]
. Por lo que en nuestro caso:
>>> zip(fields, row)
[('parliament', '7'), ('name', 'Marta Andreasen'), ('country', 'United Kingdom'), ...]
La función dict()
simplemente convierte la lista de pares en un diccionario.
>>> dict(zip(fields, row))
{'parliament': '7', 'name': 'Marta Andreasen', 'country': 'United Kingdom', ...}
El **
es una manera de convertir un diccionario en una lista de argumentos de palabra clave para una función. Entonces, function(**{'key': 'value'})
es el equivalente a function(key='value')
. Así en el ejemplo fuera, llamando create(**dict(zip(field, row)))
es el equivalente a:
create(parliament='7', name='Marta Andreasen', country='United Kingdom', ...)
Espero que esto aclare las cosas.
Si está cargando esto en Django, definitivamente mire la solución de Aram aquí para usarla. Se está aprovechando de los bits de ORM de django para ti, por lo que no es necesario que te metas con el esquema directamente. No es gran cosa si te sientes cómodo con el esquema de SQL, pero descubrí que hizo las cosas mucho más fáciles. – heckj
+1; esto es mucho mas simple! – bernie
Gracias por la respuesta Aram.Todavía estoy aprendiendo Python, ¿podrías explicar lo que hace la parte (** dict (zip (...)) de la última línea? –