¿Cómo transfiero datos en el archivo .csv a mi base de datos sqlite en django?

Esta es mi models.py

from django.db import models class School(models.Model): school = models.CharField(max_length=300) def __unicode__(self): return self.school class Lawyer(models.Model): firm_url = models.URLField('Bio', max_length=200) firm_name = models.CharField('Firm', max_length=100) first = models.CharField('First Name', max_length=50) last = models.CharField('Last Name', max_length=50) year_graduated = models.IntegerField('Year graduated') school = models.CharField(max_length=300) school = models.ForeignKey(School) class Meta: ordering = ('?',) def __unicode__(self): return self.first 

Y 2 filas de muestra del archivo csv:

 "http://www.graychase.com/aabbas,Gray & Chase LLP, Amr A ,Abbas,The George Washington University Law School, 2005" "http://www.graychase.com/kadam,Gray & Chase LLP, Karin ,Adam,Ernst Moritz Arndt University Greifswald, 2004" 

Gracias.

EDITAR

¿Puedes dar un poco más de información detallada sobre este script? Algunas preguntas:

Mi aplicación está en

 C:.../Documents/PROJECTS/Django/sw2/wkw2. 

Este camino ya está en PYTHONPATH. ¿Todavía necesito esta línea? Si es así, ¿entro así?

 sys.path.append('C:\\sw2') 

¿Qué hace os.environ ? Intenté leer la documentación pero no entendí.

 os.environ['DJANGO_SETTINGS_MODULE'] = 'sw2.settings' from django.core.management import setup_environ from sw2 import settings from sw2.wkw2.models import * import csv dataReader = csv.reader(open('csvtest1.csv'), delimiter=',', quotechar='"') for row in dataReader: lawyer=Lawyer() lawyer.firm_url=row[0] lawyer.firm_name=row[1] lawyer.first=row[2] lawyer.last=row[3] lawyer.school=row[4] lawyer.year_graduated=row[5] lawyer.save() 

¡Gracias!

Editar en respuesta a la respuesta de Celopes:

celopes

Vi tu respuesta un poco tarde. He estado intentando actualizar la base de datos en el shell con

 >>> p1 = Lawyer(school = "The George Washington University Law School", last = "Babbas", firm_url = "http://www.graychase.com/babbas", year_graduated = 2005, firm_name= "Gray & Chase", first= "Amr A") 

pero seguí recibiendo el error entero. Finalmente, me di cuenta de que la escuela necesitaba ser el school_id , es decir, en la forma,

 >>> p1 = Lawyer(school_id = 1, last = "Babbas", firm_url = "http://www.graychase.com/babbas", year_graduated = 2005, firm_name= "Gray & Chase", first= "Amr A") 

De esto me di cuenta de que necesitaba conocer la identificación de cada escuela para actualizar la tabla de abogados. Como eso no era posible, decidí quitar ForeignKey porque no sabía cómo solucionarlo. (Soy nuevo tanto en Python como en Django).

Y esta mañana he visto tu respuesta. Ahora cambié mi modelo en el servidor de desarrollo y solo tengo 1 tabla: Abogado. Creo que esto es lo que voy a usar. Mis disculpas de nuevo por no ver tu respuesta antes.

Edición 12/14/09:

celopes

Gracias de nuevo por este script. Se solucionó mi problema. Es bueno que no necesito convertir el csv a json u otro formato antes de guardar en la db. He hecho algunos cambios. Primero como mencioné antes, cambié el modelo a solo Lawyer. También, arreglaste la escuela duplicada usando “nombre”. Pero tengo list_display , list_filter y search_fields en admin.py y cambiar los nombres de los campos causó demasiados errores.

 class LawyerAdmin(admin.ModelAdmin): fieldsets = [ ('Name', {'fields': ['last', 'first', 'firm_name', 'firm_url', 'school', 'year_graduated']}), #('School', {'fields': ['school', 'year_graduated']}), ] list_display = ('last', 'first', 'firm_name', 'firm_url', 'school', 'year_graduated') list_filter = ['school', 'year_graduated'] search_fields = ['last', 'school', 'firm_name'] #search_fields = ['school__school'] #search_fields = ['school__lawyer__last'] 

Con los nuevos models.py el script simplificado funcionó bien. Esto es lo que estoy usando:

 csv_filepathname="C:/Users/A/Documents/Projects/Django/sw2/wkw2/fixtures/data1.csv" your_djangoproject_home="C:/Users/A/Documents/PROJECTS/Django/" import sys,os sys.path.append(your_djangoproject_home) os.environ['DJANGO_SETTINGS_MODULE'] ='sw2.settings' from sw2.wkw2.models import Lawyer import csv dataReader = csv.reader(open(csv_filepathname), delimiter=',', quotechar='"') for row in dataReader: lawyer=Lawyer() lawyer.firm_url=row[0] lawyer.firm_name=row[1] lawyer.first=row[2] lawyer.last=row[3] lawyer.school=row[4] lawyer.year_graduated=row[5] lawyer.save() 

También quité las comillas alrededor de cada fila. Noté que si pongo el año entre comillas, obtuve el error entero, sin comillas funciona bien. ¿Cómo lo hiciste trabajar con citas?

Gracias de nuevo, esto ha sido muy útil. Ahora tengo que hacerlo funcionar en el servidor de producción.

Creé un script completo usando estos datos como una prueba:

 "http://www.graychase.com/aabbas","Gray & Chase LLP","Amr A","Abbas","The George Washington University Law School","2005" "http://www.graychase.com/kadam","Gray & Chase LLP","Karin","Adam","Ernst Moritz Arndt University Greifswald","2004" 

Por favor, tenga en cuenta que su archivo CSV, como lo ejemplifica anteriormente, ES INCORRECTO . El lector de archivos csv leerá la línea completa como una entrada porque toda la línea está entre comillas. Elimine las comillas iniciales y finales de cada línea en el archivo csv o, como hice yo, encierre cada valor distinto en la línea entre comillas.

Aquí están sus modelos que trabajarán con el siguiente script:

 from django.db import models class School(models.Model): name = models.CharField(max_length=300, unique=True) def __unicode__(self): return self.name class Lawyer(models.Model): firm_url = models.URLField('Bio', max_length=200, unique=True) firm_name = models.CharField('Firm', max_length=100) first = models.CharField('First Name', max_length=50) last = models.CharField('Last Name', max_length=50) year_graduated = models.IntegerField('Year graduated') school = models.ForeignKey(School) def __unicode__(self): return self.first 

Aquí está la secuencia de comandos que leerá su archivo CSV (a menos que me wkw2 equivocado el nombre de su proyecto sw2 y la aplicación wkw2 , y luego corregir esas referencias):

 ############ All you need to modify is below ############ # Full path and name to your csv file csv_filepathname="C:/Users/A/Documents/Projects/Django/sw2/wkw2/fixtures/data.csv" # Full path to the directory immediately above your django project directory your_djangoproject_home="C:.../Documents/PROJECTS/Django/" ############ All you need to modify is above ############ import sys,os sys.path.append(your_djangoproject_home) os.environ['DJANGO_SETTINGS_MODULE'] ='sw2.settings' from sw2.wkw2.models import School, Lawyer import csv dataReader = csv.reader(open(csv_filepathname), delimiter=',', quotechar='"') old_school = None for row in dataReader: if old_school != row[4]: old_school = row[4] school = School() school.name = old_school school.save() dataReader = csv.reader(open(csv_filepathname), delimiter=',', quotechar='"') for row in dataReader: lawyer=Lawyer() lawyer.firm_url=row[0] lawyer.firm_name=row[1] lawyer.first=row[2] lawyer.last=row[3] lawyer_school=School.objects.get(name=row[4]) lawyer.school=lawyer_school lawyer.year_graduated=row[5] lawyer.save() 

La secuencia de comandos crea primero todas las escuelas posibles a partir de las escuelas disponibles en el archivo CSV. Luego vuelve a ejecutarse a través del CSV y crea a cada abogado.

Ejecuté este script con los datos de prueba. Funciona bien y carga todos los datos CSV.