我正在使用 django-import-export,并且想要将不同的 CSV 文件导入到一个模型。我的意思是,例如我有一个模型声明
class Statement(models.Model):
amount = MoneyField(max_digits=14,
decimal_places=4,
default_currency='EUR',
currency_field_name='currency',
default="0.0000",
currency_max_length=5,
null=True
)
type = models.CharField(name='type', choices=Type.choices, max_length=50, default=Type.INCOME)
但是我想从不同的银行账户导入对账单文件,当然,每个文件的结构可以不同。
一家银行有 CSV 之类的
ref_code, amount, currency, direction
1569852, 10.00, EUR, Income
第二银行有结构
Order number, Amount, Curr, Account No
569486, 10.99, EUR, BE658954412
但是我想导入这些数据,解析并将其插入到同一个表中。
我创建了一个资源类、自定义导入表单等
class StatementResource(resources.ModelResource):
amount = Field(attribute='amount', column_name='Amount')
currency = Field(attribute='currency', column_name='Currency')
class Meta:
model = Statement
...
class CustomImportForm(ImportForm):
bank = forms.ModelChoiceField(
to_field_name='pk',
queryset=Bank.objects.all(),
required=True)
然后我重写 get_import_data_kwargs
@admin.register(Statement)
class StatementAdmin(ImportExportModelAdmin):
resource_class = StatementResource
def get_import_form(self):
return CustomImportForm
def get_import_data_kwargs(self, request, *args, **kwargs):
form = kwargs.get('form')
if form:
return {"bank": form.cleaned_data["bank"]}
return dict()
但是如何根据选择的银行来解析 CSV?
您可以使用 django-import-export 的 v3 来完成此操作。
您需要为同一个模型定义两个资源:
class Statement1Resource(ModelResource):
class Meta:
model = Statement
fields = ['ref_code', 'amount', 'currency', 'direction']
class Statement2Resource(ModelResource):
amount = Field(attribute='amount', column_name='Amount')
currency = Field(attribute='currency', column_name='Currency')
class Meta:
model = Statement
fields = [] # declare fields as required
然后你需要在你的 Admin 类中声明这些:
class StatementAdmin(ImportExportModelAdmin):
resource_classes = [Statement1Resource, Statement2Resource]
这意味着当您导入时,您可以选择要用于导入的资源声明,例如(取自示例应用程序):