Django import-export 外键

Django import-export foreign key

我正在尝试按照 Django import-export 库 (foreign key widget) 中的指南使用外键导入数据。但是我收到以下错误,我尝试添加一个带有 header 名称 ID 的附加列,但我仍然收到相同的错误。

Errors

    Line number: 1 - 'id'
    None, 46, 19, LSD

    Traceback (most recent call last):
    File "/var/www/vfsc-env/lib/python3.6/site-packages/import_export/resources.py", line 635, in import_row
    instance, new = self.get_or_init_instance(instance_loader, row)
    File "/var/www/vfsc-env/lib/python3.6/site-packages/import_export/resources.py", line 330, in get_or_init_instance
    instance = self.get_instance(instance_loader, row)
    File "/var/www/vfsc-env/lib/python3.6/site-packages/import_export/resources.py", line 318, in get_instance
    self.fields[f] for f in self.get_import_id_fields()
    File "/var/www/vfsc-env/lib/python3.6/site-packages/import_export/resources.py", line 318, in <listcomp>
    self.fields[f] for f in self.get_import_id_fields()
    KeyError: 'id'

这是我所做的。

class Clockin_Users(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    userid = models.IntegerField(db_column='UserID', unique=True)  # Field name made lowercase.
    username = models.CharField(db_column='UserName', max_length=20, blank=True,
    facecount = models.IntegerField(db_column='FaceCount', blank=True, null=True)  # Field name made lowercase.
    userid9 = models.CharField(db_column='UserID9', max_length=10, blank=True, null=True)  # Field name made lowercase.
    depid = models.IntegerField(db_column='DepID', blank=True, null=True)  # Field name made lowercase.
    empno = models.CharField(db_column='EMPNO', max_length=50, blank=True, null=True)  # Field name made lowercase.
    def __str__(self):
        return self.name

class Clockin_Department(models.Model):
    clockinusers = models.ForeignKey(Clockin_Users, on_delete=models.CASCADE)
    depid = models.AutoField(db_column='DepID', primary_key=True)  # Field name made lowercase.
    departmentname = models.CharField(db_column='DepartmentName', max_length=100, blank=True,
                                      null=True)  # Field name made lowercase
    def __str__(self):
        return self.departmentname

class ClockinDepartmentResource(resources.ModelResource):
    clockinusers = fields.Field(column_name='clockinusers', attribute='clockinusers',
                                widget=ForeignKeyWidget(Clockin_Users))

    class Meta:
        fields = 'clockinusers'

class ClockinDepartmentAdmin(ImportExportModelAdmin):
    list_display = ('clockinusers', 'depid', 'departmentname')
    recource_class = ClockinDepartmentResource


admin.site.register(Clockin_Department, ClockinDepartmentAdmin)

这个问题经常出现,所以我会尽量给出一个全面的答案,这可能对以后的其他人有所帮助。

当您使用 django-import-export 导入文件时,文件将逐行处理。对于每一行,导入过程将测试该行是否对应于现有的存储实例,或者是否要创建一个新实例。

为了测试实例是否已经存在,django-import-export需要在导入的行中使用一个字段(或字段组合)。这个想法是该字段(或多个字段)将唯一标识您正在导入的模型类型的单个实例。

这是 import_id_fields 元属性的用武之地。您可以使用此声明来指示应使用哪个(或哪些)字段来唯一标识行。如果不声明import_id_fields,则使用默认声明,其中只有一个字段:'id'.

现在我们可以看到您的错误来源 - 导入过程正在尝试使用默认的 'id' 字段,但您的行中没有相应的字段。

要解决此问题,您需要在 csv 字段中包含 'id' 字段,或者如果这不可能,则选择一些其他字段(或多个字段)来唯一标识该行。

无论哪种情况,请确保您在 fields 属性中声明此字段(或多个字段),例如:

class BookResource(resources.ModelResource):

    class Meta:
        model = Book
        import_id_fields = ('id',)
        fields = ('id', 'name', 'author', 'price',)

请注意,如果您有多个由 import_id_fields 标识的行,那么这是不正确的,因为它应该 return 0 或 1 行。在这种情况下,您将收到 MultipleObjectsReturned 错误。