es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Importar modelo sin campo de identificación como clave primaria con Django import_export

Acabo de probar django-import-export para importar algunas cosas desde un archivo CSV. Seguí la documentación pero siempre obtengo un error al intentar importar el siguiente modelo:

class Token(models.Model):
    key = models.CharField(db_index=True, unique=True, primary_key=True)
    pool = models.ForeignKey(Pool, on_delete=models.CASCADE)
    state = models.PositiveSmallIntegerField(default=State.VALID, choices=State.choices)

Luego está la clase de recurso:

class TokenResource(resources.ModelResource):
    class Meta:
        model = Token
        skip_unchanged = True
        report_skipped = True
        fields = "key"

Ahora, al importar un archivo CSV, obtengo los siguientes errores:

Error

row number: 1 - 'id'

Traceback (most recent call last):
  File "/backend/.venv/lib/python3.9/site-packages/import_export/resources.py", line 667, in import_row
    instance, new = self.get_or_init_instance(instance_loader, row)
  File "/backend/.venv/lib/python3.9/site-packages/import_export/resources.py", line 359, in get_or_init_instance
    instance = self.get_instance(instance_loader, row)
  File "/backend/.venv/lib/python3.9/site-packages/import_export/resources.py", line 346, in get_instance
    import_id_fields = [
  File "/backend/.venv/lib/python3.9/site-packages/import_export/resources.py", line 347, in <listcomp>
    self.fields[f] for f in self.get_import_id_fields()
KeyError: 'id'

No hay un campo ‘id’ en mi modelo, el campo de clave primaria es ‘key’, ¿por qué no se toma?

¿O podría ser que un modelo debe tener un campo ‘id’ para poder ser importado? Sé que estos ids se toman para comparaciones y demás, pero hay un campo de clave primaria dentro del modelo, así que no entiendo por qué esto no se toma.

¿Cómo puedo cambiar esto sin tener que cambiar el nombre de mi modelo? No pude encontrar ninguna pista en la documentación.

Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el proceso de importación está buscando el campo ‘id’ que no está presente en su modelo. Esto podría ser debido a algún comportamiento predeterminado en django-import-export que asume que cada modelo tiene un campo ‘id’ a menos que se especifique lo contrario.

    Para resolver este problema, puede definir explícitamente el campo ‘id’ en su clase TokenResource y establecerlo en el campo ‘key’. Esto se puede hacer agregando la siguiente línea a su clase TokenResource:

    id = fields.Field(attribute='key')
    

    Esto mapeará el campo ‘id’ al campo ‘key’ en su modelo y debería permitir que el proceso de importación funcione correctamente.

    Alternativamente, puede intentar establecer el atributo ‘import_id_fields’ en la clase Meta de TokenResource a [‘key’]:

    class Meta:
        model = Token
        skip_unchanged = True
        report_skipped = True
        fields = "key"
        import_id_fields = ['key']
    

    Esto también le indicará al proceso de importación que use el campo ‘key’ como clave principal para su modelo.

    ¡Espero que esto le ayude a resolver el problema!

Comments are closed.