Naveen Sargam
Naveen Sargam

Reputation: 17

KeyError: 'id' django-import-export

I don't know where it is wrong, right in my code, please help I already wasted lot of my time... THANK YOU _/\_

admin.py
from import_export import resources
from import_export.admin import ImportExportModelAdmin

class CapabilityResource(resources.ModelResource):
    model = Capability
    skip_unchanged = True
    report_skipped = True
    exclude = ('id',)
    import_id_fields = ('capscode', 'capsid', 'capsname', 'cfor', 'parent',)



@admin.register(Capability)
class CapabilityAdmin(ImportExportModelAdmin):
    resource_class = CapabilityResource
    fields = ['capscode', 'capsname', 'cfor', 'parent']
    list_display = ['capscode', 'capsname', 'cfor', 'parent']
    list_display_links = ['capscode', 'capsname']


models.py
class Capability(models.Model):  
    CFOR_CHOICES = [('WEB', 'WEB'), ('PORTLET', 'PORTLET'), ('REPORT', 'REPORT'), ('MOB', 'MOB')]
    capsid      = models.AutoField(primary_key=True, auto_created=True, editable=False)
    capscode    = models.CharField(_('caps'), max_length=50)
    capsname    = models.CharField(_('includes'), max_length=1000, default = None, blank=True, null=True)
    parent      = models.ForeignKey('self', on_delete=models.RESTRICT, db_column='parent', null=True, blank=True, related_name='children')
    cfor        = models.CharField(_('cfor'), max_length=10, default='WEB', choices=CFOR_CHOICES)
    clientid    = models.ForeignKey('onboarding.Bt',  null=True, blank=True, on_delete = models.RESTRICT, db_column='clientid')


csv data:
capscode    capsid  capsname        cfor    parent
NONE            1   NONE            WEB 
DASHBOARDS      2   DASHBOARDS      WEB     1
RP_MONITORING   3   RP MONITORING   WEB     2
FACILITY        4   FACILITY        WEB     2

versions:
django-import-export==2.6.0
Django==3.2.4
python=3.8.10

Errors: Line number: 1 - 'id' NONE, 1, NONE, WEB, Traceback (most recent call last): File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 650, in import_row instance, new = self.get_or_init_instance(instance_loader, row) File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 342, in get_or_init_instance instance = self.get_instance(instance_loader, row) File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 329, in get_instance import_id_fields = [ File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 330, in self.fields[f] for f in self.get_import_id_fields() KeyError: 'id'

Line number: 2 - 'id' DASHBOARDS, 2, DASHBOARDS, WEB, 1 Traceback (most recent call last): File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 650, in import_row instance, new = self.get_or_init_instance(instance_loader, row) File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 342, in get_or_init_instance instance = self.get_instance(instance_loader, row) File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 329, in get_instance import_id_fields = [ File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 330, in self.fields[f] for f in self.get_import_id_fields() KeyError: 'id'

Line number: 3 - 'id' RP_MONITORING, 3, RP MONITORING, WEB, 2 Traceback (most recent call last): File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 650, in import_row instance, new = self.get_or_init_instance(instance_loader, row) File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 342, in get_or_init_instance instance = self.get_instance(instance_loader, row) File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 329, in get_instance import_id_fields = [ File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 330, in self.fields[f] for f in self.get_import_id_fields() KeyError: 'id'

Line number: 4 - 'id' FACILITY, 4, FACILITY, WEB, 2 Traceback (most recent call last): File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 650, in import_row instance, new = self.get_or_init_instance(instance_loader, row) File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 342, in get_or_init_instance instance = self.get_instance(instance_loader, row) File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 329, in get_instance import_id_fields = [ File "/home/xyz/abc/envs/intelliwiz_env/lib/python3.8/site-packages/import_export/resources.py", line 330, in self.fields[f] for f in self.get_import_id_fields() KeyError: 'id'

Upvotes: 1

Views: 2784

Answers (2)

mcorbe
mcorbe

Reputation: 175

Late to the party but as I had the same issue.. here we go.

You can specify your pk/id import column in your resource options.

So that would give you:

class CapabilityResource(resources.ModelResource):
  class Meta:
    model = Capability
    ...
    import_id_fields = ['capsid', ]

More info here: https://github.com/django-import-export/django-import-export/blob/main/import_export/resources.py#L80

Upvotes: 1

sbidwai
sbidwai

Reputation: 606

Try changing your CapabilityResource to following

class CapabilityResource(resources.ModelResource):
  class Meta:
    model = Capability
    skip_unchanged = True
    report_skipped = True
    exclude = ('id')
    fields=('id','capscode','capsid','capsname', 'cfor', 'parent')

Basically fields list needs to contain "id" field which will be used to determine existing database rows.

Upvotes: 0

Related Questions