Django-import-export не импортирует csv или excel файл с атрибутом ForeignKey в панели сайта администратора Django

Я использую модуль Django-import-export в Django (версия 4.0.1).

У меня есть 2 разные таблицы с именами State и District

<1>> использует district model как state_nameForeignKey

Поля в таблице state могут быть импортированы из Django admin site panel без каких-либо проблем как: state

но атрибуты района не могут быть импортированы через файл 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 мета декларации.

Пожалуйста, обратитесь к этому ответу.

Вернуться на верх