Django import-export library ForeignKey error (IntegrityError: FOREIGN KEY constraint failed in django)

Прежде всего, пожалуйста, извините за мой английский. ))

У меня проблема с библиотекой импорта-экспорта Django, когда я пытаюсь импортировать данные из файлов csv/xls/xlsx в DB приложения Django.

Как это выглядит.

Вот мой models.py:

class Department(models.Model):
    department_name = models.CharField(max_length = 50, default = '', 
        verbose_name = 'Подразделение')
    def __str__(self):
        return f'{self.department_name}'

class ITHardware(models.Model):
    it_hardware_model = models.CharField(max_length = 100)
    it_hardware_serial_number = models.CharField(max_length = 100, 
        blank = True, default = '')
    it_hardware_department = models.ForeignKey(Department, 
        related_name = 'department', on_delete = models.SET_NULL, default = '', 
        null = True, blank = True, db_constraint=False)

admin.py:

@admin.register(Department)
class DepartmentAdmin(admin.ModelAdmin):
    list_display = ('department_name', )
    actions = [dublicate_object]

@admin.register(ITHardwareManufacturer)
class ITHardwareManufacturerAdmin(admin.ModelAdmin):
    list_display = ('manufacturer', )
    actions = [dublicate_object]

class ITHardwareImportExportAdmin(ImportExportModelAdmin):
    resource_class = ITHardwareResource
    list_display = ['id', 'it_hardware_manufacturer', 
        'it_hardware_model', 'it_hardware_serial_number', 
        'it_hardware_department']
    actions = [dublicate_object]

resource.py:

class ITHardwareResource(resources.ModelResource):
    it_hardware_department = fields.Field(
        column_name = 'it_hardware_department',
        attribute = 'ITHardware.it_hardware_department',
        widget = widgets.ForeignKeyWidget(Department, field = 'department_name'))
    
    class Meta():
        model = ITHardware
        fields = (
            'id',
            'it_hardware_model', 
            'it_hardware_serial_number', 
            'it_hardware_department', 
            )
        export_order = (
            'id',
            'it_hardware_model', 
            'it_hardware_serial_number', 
            'it_hardware_department', 
            )

импорт файла:

импортировать файл

При попытке импортировать данные из файла я получаю такую ошибку: String number: 1 - ITHardwareManufacturer matching query does not exist. None, Canon, BX500CI, 5B1837T00976, Office_1, IT_1

И так далее.

OK. Когда я заполняю таблицу Department вручную через adminpanel (указал там IT_1, 2, 3 и 4 отделы) я получаю вот такое превью:

превью

и затем я получаю эту ошибку:

ошибка

Пожалуйста, объясните мне, что я делаю неправильно и как это исправить.

Исходя из вашего примера кода, процесс импорта будет искать поле под названием it_hardware_department в файле импорта (и мы видим, что оно там есть). Во время импорта он попытается найти отношение FK в Department, выполнив простое get(name=<value in column>. Он сохранит это значение в ITHardware.it_hardware_department - однако это не сработает, поскольку это не является действительным полем модели. Вам следует переименовать его в it_hardware_department (что вы и сделали). Тот факт, что значение отображается на экране предварительного просмотра, говорит о том, что все работает нормально.

Ошибка 'FK contraint' failed говорит о том, что вы пытались записать в таблицу с недопустимым FK-отношением. Я предлагаю запустить отладчик или добавить печать для проверки объекта перед его сохранением. Вполне вероятно, что один из ваших необходимых внешних ключей будет пуст. Я не думаю, что это it_hardware_department, потому что у него есть значение в предварительном просмотре. Есть ли в вашей модели другие FK, которые не указаны в списке?

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