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