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]
Это означает, что при импорте вы можете выбрать, какое объявление ресурса вы хотите использовать для импорта, например (взято из примера приложения):
