Django admin импорт-экспорт одной модели и двух разных csv файлов в зависимости от выбора опций?

Я использую django-import-export, и хочу импортировать в одну модель разные CSV файлы. То есть, например, у меня есть модель Statement

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, сумма, валюта, направление 1569852, 10.00, EUR, Доход

< < <

Я создал класс Resource, Custom Import Form, и т.д.

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 в зависимости от того, какой банк выбран?

Вы можете сделать это, используя v3 django-import-export (в настоящее время находится в бета-версии).

Вам необходимо определить два ресурса для одной и той же модели:


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]

Это означает, что при импорте вы можете выбрать, какое объявление ресурса вы хотите использовать для импорта, например (взято из примера приложения):

enter image description here

Вернуться на верх