He pasado bastante tiempo para resolver esto. Simplemente estoy tratando de importar un archivo CSV usando el módulo csv de Python y get_or_create () de Django.
Este es mi código simple (construido sobre este código):
import csv from .models import Person def import_data(): with open('/path/to/csv/people_list.csv') as f: reader = csv.reader(f) for row in reader: _, created = Org.objects.get_or_create( name=row[0], p_id=row[1], current_status=row[2], )
Recibo el siguiente error cuando ejecuto import_data () en el shell
peoplelisting.models.DoesNotExist: Person matching query does not exist.
Sí, esta Persona en particular no existe, pero ¿no es el punto de usar get_or_create ()? Si no existe, créalo?
Después de jugar mucho, finalmente me di cuenta de que el problema era el siguiente:
Mi csv también contenía una fila de encabezado que no estaba ignorando . Pensé que seguiría con la comida e ignoraré el encabezado solo después de que la importación de CSV funcionara, pero el encabezado mismo estaba creando el problema (gracias a esta publicación que (indirectamente) ayudó mucho). Los valores en el encabezado no coincidían con el esquema (max_length etc.) y eso es a lo Person matching query does not exist
se refería. Ignorar el encabezado lo hizo funcionar. Sin embargo, solo espero que el mensaje de error sea más descriptivo. Espero que ayude a alguien más a ahorrar las horas que pasé depurando una cosa simple. Aquí está el código correcto:
import csv from .models import Person def import_data(): with open('/path/to/csv/people_list.csv') as f: reader = csv.reader(f) for row in reader: if row[0] != 'Person_name': #where Person_name is first column's name _, created = Org.objects.get_or_create( name=row[0], p_id=row[1], current_status=row[2], )
En lugar de tener que marcar la fila [0] cada vez, simplemente puede omitir la primera fila:
next(reader, None) # skip the headers
fuente: omita los encabezados al editar un archivo csv con Python