I am using the Django-import-export module in Django(version 4.0.1).
I have 2 different tables named State
and District
the district model
is using state_name
as ForeignKey
The fields in state table can be imported from the Django admin site panel
without any issue as:
but district attributes can not be imported via csv/excel file and the error is as follows:
Line number: 1 - 'id'ANDAMAN AND NICOBAR ISLANDS, NICOBARSTraceback (most recent call last):File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\import_export\resources.py", line 667, in import_rowinstance, new = self.get_or_init_instance(instance_loader, row)File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\import_export\resources.py", line 359, in get_or_init_instanceinstance = self.get_instance(instance_loader, row)File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\import_export\resources.py", line 346, in get_instanceimport_id_fields = [File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\import_export\resources.py", line 347, in <listcomp>self.fields[f] for f in self.get_import_id_fields()KeyError: 'id'
The model.py
is as:
from django.db import models####################################################################################class State(models.Model): state_name = models.CharField(max_length=30) class Meta: db_table = 'State_Names' def __str__(self): return self.state_name####################################################################################class District(models.Model): state_name = models.ForeignKey(State, on_delete=models.CASCADE) district_name = models.CharField(max_length=30) class Meta: db_table = 'District_Names' def __str__(self): return self.district_name
The resources.py
is as:
from import_export import fields, resourcesfrom import_export.widgets import ForeignKeyWidgetfrom damuwhatsapp.models import Statefrom damuwhatsapp.models import Districtclass StateResource(resources.ModelResource): class Meta: model = Stateclass DistrictResource(resources.ModelResource): class StateForeignKeyWiget(ForeignKeyWidget): def get_queryset(self, value, row): return self.model.objects.filter( state_name__exact=row["state_name"], ) state_name = fields.Field( column_name='state_name', attribute='state_name', widget=StateForeignKeyWiget( State, field='state_name' ) ) district_name = fields.Field(column_name="district_name", attribute="district_name") class Meta: model = District exclude = ('id') fields = ('state_name','district_name',)
The admin.py
is as:
from django.contrib import adminfrom import_export.admin import ImportExportModelAdmin from damuwhatsapp.models import Statefrom damuwhatsapp.models import Districtfrom damuwhatsapp.resources import StateResourcefrom damuwhatsapp.resources import DistrictResourceclass StateAdmin(ImportExportModelAdmin, admin.ModelAdmin): resource_class = StateResource list_display = ("id", "state_name") search_fields = ["state_name"] readonly_fields = ["id"] filter_horizontal = () list_filter = () fieldset = ()class DistrictAdmin(ImportExportModelAdmin, admin.ModelAdmin): resource_class = DistrictResource list_display = ["id","state_name","district_name"] search_fields = ("state_name", "district_name") readonly_fields = ["id"] filter_horizontal = () list_filter = () fieldset = ()admin.site.register(State, StateAdmin)admin.site.register(District, DistrictAdmin)
I need to import the csv having district_name which uses state_names as ForeignKey field from Django Admin Panel. I have followed few question like but could not find the solution. Can you have a look at the code and see which part I am doing wrong or needs to be changed?Or what is the alternate option for doing so.
The CSV file structure which is to be imported is as.