Django 导入导出外键

use*_*958 2 django django-import-export

我正在尝试按照 Django 导入导出库(外键小部件)的指南使用外键导入数据。但我收到以下错误,我尝试添加带有标题名称 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'
Run Code Online (Sandbox Code Playgroud)

这就是我所做的。

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

    class Meta:
        fields = 'clockinusers'
Run Code Online (Sandbox Code Playgroud)

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


admin.site.register(Clockin_Department, ClockinDepartmentAdmin)
Run Code Online (Sandbox Code Playgroud)

Mat*_*rty 9

这个问题经常出现,所以我会尝试给出一个全面的答案,这可能会在将来帮助其他人。

当您使用 导入文件时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',)
Run Code Online (Sandbox Code Playgroud)

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