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.nameRun 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.departmentnameRun 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)
这个问题经常出现,所以我会尝试给出一个全面的答案,这可能会在将来帮助其他人。
当您使用 导入文件时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错误。
| 归档时间: |
|
| 查看次数: |
2605 次 |
| 最近记录: |