繁体   English   中英

Django 导入导出库 ForeignKey 错误(IntegrityError: FOREIGN KEY constraint failed in django)

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

首先请原谅我的英语。 ))

因此,当我尝试将数据从csv/xls/xlsx文件导入 Django 应用程序数据库时,我遇到了 Django 导入导出库的问题。

它看起来如何。

这是我的models.py:

class Department(models.Model):
    department_name = models.CharField(max_length = 50, default = '')
    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)

管理员.py:

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

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

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

资源.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

等等。

好的。 当我通过管理面板手动填写部门表(指向adminpanel和 4 部门)时,我得到了这个预览:

预习

然后我得到这个错误:

错误

请解释我做错了什么以及如何解决它。

更新

如果我正确理解了这个概念,那么“column_name”是导入/导出数据的列的名称,而“attribute”是相同操作的数据库字段的名称。

出口对我来说很好。 但是,对于导入,据我了解,我错误地描述了 ForeignKey 的机制。 也就是说,我试图告诉 Django,当从文件的“it_hardware_department”列导入数据时,应该使用 ForeignKeyWidget 将该数据写入 Department 模型的“it_hardware_department”字段。

也许需要一些中间操作来确定将数据写入部门模型的机制,在哪里指定诸如“Department__it_hardware_department”之类的内容?

更新:追溯

Traceback (most recent call last):
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\db\backends\base\base.py", line 242, in _commit
    return self.connection.commit()

The above exception (FOREIGN KEY constraint failed) was the direct cause of the following exception:
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\contrib\admin\sites.py", line 232, in inner
    return view(request, *args, **kwargs)
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\views\decorators\http.py", line 40, in inner
    return func(request, *args, **kwargs)
  File "C:\users\iv\mip\mip_env\lib\site-packages\import_export\admin.py", line 113, in process_import
    result = self.process_dataset(dataset, confirm_form, request, *args, **kwargs)
  File "C:\users\iv\mip\mip_env\lib\site-packages\import_export\admin.py", line 125, in process_dataset
    return resource.import_data(dataset,
  File "C:\users\iv\mip\mip_env\lib\site-packages\import_export\resources.py", line 771, in import_data
    return self.import_data_inner(
  File "C:\users\iv\mip\mip_env\lib\site-packages\import_export\utils.py", line 25, in __exit__
    self.context_manager.__exit__(*args)
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\db\transaction.py", line 246, in __exit__
    connection.commit()
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\utils\asyncio.py", line 33, in inner
    return func(*args, **kwargs)
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\db\backends\base\base.py", line 266, in commit
    self._commit()
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\db\backends\base\base.py", line 242, in _commit
    return self.connection.commit()
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\db\utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\users\iv\mip\mip_env\lib\site-packages\django\db\backends\base\base.py", line 242, in _commit
    return self.connection.commit()

Exception Type: IntegrityError at /admin/mip_apps/ithardware/process_import/
Exception Value: FOREIGN KEY constraint failed

根据您的代码示例,导入过程将在导入文件中查找名为it_hardware_department的字段(我们可以看到它在那里)。 在导入期间,它将尝试通过执行简单的get(name=<value in column>来查找Department中的 FK 关系。它将将此值存储在ITHardware.it_hardware_department中 - 但是这不起作用,因为这不是有效的模型字段。您应该将其重命名为it_hardware_department (您说您这样做了)。预览屏幕中显示的事实告诉我这工作正常。

“FK 约束”失败错误表示您尝试使用无效的 FK 关系写入表。 我建议在保存对象之前运行调试器或添加打印以检查对象。 您所需的外键之一很可能在此处为空。 我不认为它是it_hardware_department ,因为它在预览中具有价值。 您的模型中是否还有其他未列出的 FK?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM