从没有 id 作为列的 CSV 文件导入数据

Import data from a CSV file without id as column

我想知道是否可以导入数据,但 table 没有名为 id

的列

我的导入在每个包含 id 但不包含列 id[= 的 table 上运行良好26=] 它不起作用。我收到 row_error 的说法: Error: 'id'

无法导入的型号

class CustomizingObject(models.Model):
    code = models.CharField(max_length=40, primary_key=True, unique=True, help_text="Human readable code")

我的函数

from import_export import resources

lo_resource = resources.modelresource_factory(model=lo_resource_to_import)() # lo_resource_to_import is the model
with open(lv_local_filename, 'r', encoding='utf-8') as f:
    csv_data = f.read()
    lt_dataset = tablib.Dataset().load(csv_data, 'csv')

result = lo_resource.import_data(lt_dataset, dry_run=True)
if not result.has_errors():
    result = lo_resource.import_data(lt_dataset, dry_run=False)
    Logger.Info("import", 2) # Import over
else :
    Logger.Error("import", 3, lv_local_filename) # Input file {} has error
    for ld_error in result.row_errors():
        Logger.Error("import", 5, ld_error[1][0].error) # Error: {}

Django 提供了一个 import_id_fields 所以我们可以指定我们想要导入的字段。没有它,它总是寻找一个字段 ID.

解决方案是用 resources.ModelResource 封装我的 class 并指定 import_id_fields.

class CustomizingObjectResource(resources.ModelResource):

    class Meta:
        model = CustomizingObject
        import_id_fields = ('code',)
        fields = ('code')

我的函数

# specific is a parameter of my function here specific = CustomizingObjectResource
if specific is not None:
    lo_resource = specific()
else:
    lo_resource = resources.modelresource_factory(model=lo_resource_to_import)()
with open(lv_local_filename, 'r', encoding='utf-8') as f:
    csv_data = f.read()
    lt_dataset = tablib.Dataset().load(csv_data, 'csv')

result = lo_resource.import_data(lt_dataset, dry_run=True)
if not result.has_errors():
    result = lo_resource.import_data(lt_dataset, dry_run=False)
    Logger.Info("import", 2) # Import over
else :
    Logger.Error("import", 3, lv_local_filename) # Input file {} has error
    for ld_error in result.row_errors():
        Logger.Error("import", 5, ld_error[1][0].error) # Error: {}