【问题标题】:Need to know where is the problem with bulk import and how to fix it需要知道批量导入的问题在哪里以及如何解决它
【发布时间】:2023-04-07 14:49:02
【问题描述】:

我正在使用 Django 构建应用程序,我需要使用 django-import-export 导入数据。

我正在使用最后一个包的批量导入。我可以第一次导入数据,但是当我第二次尝试导入时出现错误。预期的行为是不导入数据并且不会导致错误。

我的视图看起来像这样(我简化了下面的代码,因为在实际视图中我有四个资源和四个文件要导入)

def complete_import(request):
    if request.method == 'POST':
        offering_resource = OfferingResource()
        issuer_resource = IssuerResource()

        offering_dataset = Dataset()
        issuer_dataset = Dataset()

        offering = request.FILES['offering']
        issuer = request.FILES['issuer']

        offering_data = offering_dataset.load(offering.read().decode('utf-8'), format='csv', delimiter='\t', headers=True)
        issuer_data = issuer_dataset.load(issuer.read().decode('utf-8'), format='csv', delimiter='\t', headers=True)
        
        offering_data.append_col(get_quarter, header='quarter')
        issuer_data.append_col(get_quarter, header='quarter')

        offering_result = offering_resource.import_data(offering_data, dry_run=True, raise_errors=True)
        issuer_result = issuer_resource.import_data(issuer_data, dry_run=True, raise_errors=True)
       
        if not offering_result.has_errors() and issuer_result.has_errors():
            offering_resource.import_data(offering_dataset, dry_run=False)
            del offering_result
            issuer_resource.import_data(issuer_dataset, dry_run=False)
            del issuer_result
        else:
            print('an error occurred')

    return render(request, 'index.html')

我的资源如下所示:

class OfferingResource(ModelResource):
    accession_number = Field(
        attribute='company',
        column_name='ACCESSIONNUMBER',
        widget=ForeignKeyWidget(Company, 'accession_number'))
    quarter = Field(attribute='quarter')
    # other fields
   
    class Meta:
        model = Offering
        use_bulk = True
        skip_diff = True
        batch_size = 1000
        import_id_fields = ('accession_number', 'quarter')

    def before_import_row(self, row, row_number=None, **kwargs):
        total_offering_amount = row.get('TOTALOFFERINGAMOUNT')
        try:
            row['TOTALOFFERINGAMOUNT'] = int(total_offering_amount)
        except ValueError:
            row['TOTALOFFERINGAMOUNT'] = -1
        Company.objects.get_or_create(accession_number=row.get('ACCESSIONNUMBER'))


class IssuerResource(ModelResource):
    accession_number = Field(attribute='company',
                            column_name='ACCESSIONNUMBER',
                            widget=ForeignKeyWidget(Company, 'accession_number'))
    quarter = Field(attribute='quarter')
    issuer_seq_key = Field(attribute='issuer_seq_key', column_name='ISSUER_SEQ_KEY')
    # other filds

    class Meta:
        model = Issuer
        use_bulk = True
        skip_diff = True
        batch_size = 1000
        import_id_fields = ('accession_number', 'issuer_seq_key', 'quarter')

当我在 Meta 类中评论 use_bulk 时,我得到了预期的行为。

编辑

我得到的错误(我之前忘记添加了)

bulk_update() cannot be used with primary key fields.

我想知道如何解决这个问题?

【问题讨论】:

  • 您看到了什么错误?
  • 这就是问题所在,django-import-export 没有在控制台中记录或引发错误。
  • 我建议使用raise_errors=True 运行第一次调用,或者使用调试器逐步执行
  • @MatthewHegarty 我用过它,但在错误的地方,现在我纠正了这个(请检查我的问题)。现在我认为问题是由资源类的 Meta 类的use_bulk 引起的。
  • 您是否收到任何错误消息输出?

标签: django django-import-export


【解决方案1】:

大概您正在使用主键字段作为资源列表中的字段之一。您不能将主键字段与 Django 的 bulk_update() (docs) 一起使用。

您可以从字段列表中删除 PK 字段吗?如果没有,是否有其他唯一字段可用于唯一标识应更新的记录。

【讨论】:

    猜你喜欢
    • 2021-08-11
    • 1970-01-01
    • 2022-01-21
    • 2017-11-22
    • 2018-09-17
    • 2021-05-01
    • 1970-01-01
    • 2018-12-14
    • 2014-06-01
    相关资源
    最近更新 更多