【发布时间】: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