Home > database >  Import model without id field as primary key with django import_export
Import model without id field as primary key with django import_export

Time:12-22

just tried out django-import-export to import som things from a csv-file. Followed the doc but I always get an error when trying to import the following Model:

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)

then the resource class:

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

Now when importing a csv-file i get the following errors:

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'

There is no field id within my model the primary key field is key so why it is not taken?

Or could it be that a model must have an id field to get imported? I know that this ids are taken for comparision and so on but there is a primary key field within the model, so I do not understand why this is not taken.

How could I change this without having to rename my model? I could not find a hint within the docs.

Thanks

CodePudding user response:

There is no field id within my model the primary key field is key so why it is not taken?

The default field for identifying whether an object exists or not is called 'id'. However you can override using import_id_fields, so in your case the following should work:

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

        # you can optionally use 'fields' as a whitelist for 
        # fields to be imported
        fields = ("key",)
  • Related