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, которые не указаны в списке?