Django-import-export не импортирует csv или excel файл с атрибутом ForeignKey в панели сайта администратора Django
Я использую модуль Django-import-export в Django (версия 4.0.1).
У меня есть 2 разные таблицы с именами State
и District
<1>> использует district model
как state_name
ForeignKey
Поля в таблице state могут быть импортированы из Django admin site panel
без каких-либо проблем как:
но атрибуты района не могут быть импортированы через файл csv/excel и ошибка выглядит следующим образом:
Line number: 1 - State matching query does not exist.
ANDAMAN AND NICOBAR ISLANDS, NICOBARS
Traceback (most recent call last):
File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\import_export\resources.py", line 667, in import_row
instance, 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_instance
instance = self.get_instance(instance_loader, row)
File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\import_export\resources.py", line 352, in get_instance
return instance_loader.get_instance(row)
File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\import_export\instance_loaders.py", line 29, in get_instance
params[field.attribute] = field.clean(row)
File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\import_export\fields.py", line 66, in clean
value = self.widget.clean(value, row=data, **kwargs)
File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\import_export\widgets.py", line 406, in clean
return self.get_queryset(value, row, *args, **kwargs).get(**{self.field: val})
File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\query.py", line 439, in get
raise self.model.DoesNotExist(
damuwhatsapp.models.State.DoesNotExist: State matching query does not exist.
В качестве model.py
выступает:
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
В качестве resources.py
выступает:
from import_export import fields, resources
from import_export.widgets import ForeignKeyWidget
from damuwhatsapp.models import State
from damuwhatsapp.models import District
class StateResource(resources.ModelResource):
class Meta:
model = State
class 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
import_id_fields = ("state_name",)
fields = ('state_name','district_name',)
В качестве admin.py
выступает:
from django.contrib import admin
from import_export.admin import ImportExportModelAdmin
from damuwhatsapp.models import State
from damuwhatsapp.models import District
from damuwhatsapp.resources import StateResource
from damuwhatsapp.resources import DistrictResource
class StateAdmin(ImportExportModelAdmin, admin.ModelAdmin):
resource_class = StateResource
list_display = ("id",
"state_name")
# create search field in admin page
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"]
# create search field in admin page
search_fields = ("state_name",
"district_name")
readonly_fields = ["id"]
filter_horizontal = ()
list_filter = ()
fieldset = ()
admin.site.register(State, StateAdmin)
admin.site.register(District, DistrictAdmin)
Мне нужно импортировать csv, содержащий имя_района, который использует поле state_names как ForeignKey из Django Admin Panel. Я проследил несколько вопросов, но не смог найти решение. Не могли бы вы взглянуть на код и посмотреть, какую часть я делаю неправильно или что нужно изменить? Или какой есть альтернативный вариант для этого.
В DistrictResource
вы исключаете поле 'id' и не объявляете 'import_id_fields' - поэтому процесс импорта 'района' не может определить, импортируете ли вы новый или существующий экземпляр.
Вы, вероятно, хотите добавить import_id_fields = ('state_name','district_name')
к DistrictResource
мета декларации.
Пожалуйста, обратитесь к этому ответу.