【问题标题】:Django Import-Export import error for one-to-one field - KeyError: 'id'一对一字段的 Django Import-Export 导入错误 - KeyError: \'id\'
【发布时间】:2022-08-04 23:47:17
【问题描述】:

使用: Python 3.10.4
姜戈 4.06
Django 导入导出 2.8.0

我正在尝试将数据导入到我的 django 应用程序中用作演示数据。我不断收到 KeyError。

### models.py
class Reservation(models.Model):
    reservation = models.OneToOneField(Vehicle, on_delete=models.CASCADE, primary_key=True,)
    delivered = models.BooleanField(\'Delivered\',default=False)
    date_reserved = models.DateTimeField(\'date reserved\', default=datetime.datetime.now)
    ...

### admin.py
class ReservationResource(resources.ModelResource):
    class Meta:
        model = Reservation
        exclude = (\'id\',)
        import_id_fields = (\'reservation\',)
        fields = (
            \'reservation\',
            \'delivered\',
            \'date_reserved\',
            ...
        )
class ReservationImportExport(ImportExportModelAdmin):
    resource_class: ReservationResource
@admin.register(Reservation)
class ReservationAdmin(SimpleHistoryAdmin, ReservationImportExport):
    fields = [\"delivered\",\"date_reserved\",...]

### demo-reservations.yaml  (Note: Problem happens using different data file formats)
 - reservation: 50001
   delivered: False
   date_reserved: 7/15/2022T00:00:00+00:00
   ...

这是错误(稍微混淆)

Traceback (most recent call last):
File \"c:\\Users\\...\\lib\\site-packages\\import_export\\resources.py\", line 661, in import_row
instance, new = self.get_or_init_instance(instance_loader, row)
File \"c:\\Users\\...\\lib\\site-packages\\import_export\\resources.py\", line 353, in get_or_init_instance
instance = self.get_instance(instance_loader, row)
File \"c:\\Users\\...\\lib\\site-packages\\import_export\\resources.py\", line 340, in get_instance
import_id_fields = [
File \"c:\\Users\\...\\lib\\site-packages\\import_export\\resources.py\", line 341, in <listcomp>
self.fields[f] for f in self.get_import_id_fields()
KeyError: \'id\'

已经尝试过:

  1. 从管理员注册中删除了 SimpleHistoryAdmin
  2. 在调试器中设置断点 - 很明显它忽略了“import_id_fields”值。如果我在调用 get_import_id_fields(self) 时手动将值更改为 \'reservation\',我会走得更远(我将单独询问第二个问题 - 猜测 stackoverflow 每个问题需要 1 个问题。如果将它们混为一谈,请随时告诉我效果更好。)我确实在调试器中看到 \'id\' 是 self._meta.import_id_fields 在调用时的值。
  3. 将模型从 OneToOne 更改为 ForeignKey

    我设法挖掘的所有其他答案似乎都说添加排除 id 和 import_id_fields 应该可以解决这个问题。我唯一的想法不是试过(和真的不想)正在更改 id/外键列名。

    编辑1: 在这一点上,我几乎可以肯定这是 django-import-export 包中的一个错误。如果模型中有名为 \"id\" 的字段,则管理员导入被破坏。我有点过头了,无法完全排除故障。 我在 GitHub 上输入了一个错误。 https://github.com/django-import-export/django-import-export/issues/1480

  • this answer 可能会帮助你
  • @MatthewHegarty 我之前遵循了这种确切的方法,但问题仍然存在。我尝试将“id”添加到类元下的字段以及导入文件中,即使该字段不在我的模型中(这是与我上面的代码的唯一区别)。我尝试了使用和不使用排除 = (\'id\',)。
  • 很难判断发生了什么。最好的办法是使用调试器。如果get_import_id_fields() 没有返回您声明的元字段,那么为什么会这样。
  • @MatthewHegarty 谢谢。经过进一步测试,我确信这是一个错误,我输入了一个关于 GH 的但报告。从这里链接,以防其他人遇到这个问题并偶然发现这个问题。

标签: python django django-import-export


【解决方案1】:

万一找到了,只想关闭循环。我的代码有错误。

class ReservationImportExport(ImportExportModelAdmin):
    resource_class: ReservationResource

本来应该:

class ReservationImportExport(ImportExportModelAdmin):
    resource_class = ReservationResource

= 而不是 : 让一切变得不同。

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多