Django 管理导入导出一个模型和两个不同的 csv 文件,具体取决于选择的选项?

问题描述 投票:0回答:1

我正在使用 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 django-admin django-import-export
1个回答
2
投票

您可以使用 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]

这意味着当您导入时,您可以选择要用于导入的资源声明,例如(取自示例应用程序):

© www.soinside.com 2019 - 2024. All rights reserved.