Django Import Export

django-import-export позволяет легко добавить функционал импорта и экспорта данных в Django админку.

Установка

1# Установка пакета
2pip install django-import-export
1# Или через Poetry
2poetry add django-import-export

Настройка

 1# settings.py
 2INSTALLED_APPS = [
 3    'import_export',
 4]
 5
 6# admin.py
 7from import_export.admin import ImportExportModelAdmin
 8from import_export import resources
 9from .models import Book
10
11class BookResource(resources.ModelResource):
12    class Meta:
13        model = Book
14        import_id_fields = ('id',)
15
16@admin.register(Book)
17class BookAdmin(ImportExportModelAdmin):
18    resource_class = BookResource
19    list_display = ['title', 'author', 'published_date']

Кастомизация полей

 1from import_export import fields
 2
 3class BookResource(resources.ModelResource):
 4    author_name = fields.Field(
 5        column_name='author_name',
 6        attribute='author__name'
 7    )
 8
 9    class Meta:
10        model = Book
11        fields = ('id', 'title', 'author_name')
12        export_order = ('id', 'title', 'author_name')

Валидация данных

 1class BookResource(resources.ModelResource):
 2    def before_import_row(self, row, **kwargs):
 3        # Валидация перед импортом
 4        if not row.get('title'):
 5            raise ValueError('Title is required')
 6
 7    def after_import_row(self, row, instance, **kwargs):
 8        # Действия после импорта
 9        instance.save()
10
11    class Meta:
12        model = Book

Экспорт в разные форматы

1# В админке автоматически доступны:
2# - CSV
3# - JSON
4# - XLS
5# - XLSX
6# - TSV
7# - ODS
8# - HTML

FAQ

Q: Как валидировать данные при импорте?
A: Переопредели метод before_import_row в resource классе.

Q: Можно ли экспортировать только определенные поля?
A: Да, используй fields в Meta классе.