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
错误。
我正在尝试按照 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
错误。