django-import-export

4.4.0 · active · verified Fri Apr 10

django-import-export is a versatile Django application and library for importing and exporting data, with seamless integration into the Django admin interface. It supports various data formats like CSV, JSON, and Excel, and allows for robust customization through `Resource` classes for complex data mapping and transformations. The project maintains active development with regular patch releases and significant updates approximately once a year.

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to define a `ModelResource` for a Django model and perform a programmatic export. It includes a minimal Django setup to make the example runnable independently, showing how to handle related `ForeignKey` fields using `ForeignKeyWidget` for clear human-readable mapping during export and import.

import os
import django
from django.conf import settings
from import_export import resources
from import_export.fields import Field
from import_export.widgets import ForeignKeyWidget

# Minimal Django setup for standalone script
if not settings.configured:
    settings.configure(
        INSTALLED_APPS=[
            'django.contrib.auth',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.admin',
            'import_export',
            'my_app', # Placeholder for your app
        ],
        DATABASES={'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:'}},
        DEBUG=True,
        USE_TZ=True,
        TIME_ZONE='UTC',
        SECRET_KEY=os.environ.get('DJANGO_SECRET_KEY', 'super-secret-key-for-testing'),
        TEMPLATES=[{
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            'APP_DIRS': True,
        }],
        ROOT_URLCONF='django_import_export.urls', # Dummy URLconf required by django.setup()
    )
    django.setup()

from django.db import models

# 1. Define your Django Models (example)
class Category(models.Model):
    name = models.CharField(max_length=100, unique=True)
    def __str__(self): return self.name
    class Meta: app_label = 'my_app'

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True)
    def __str__(self): return self.name
    class Meta: app_label = 'my_app'

# Need to create tables for these models in the in-memory DB for the example
from django.db import connection
with connection.schema_editor() as schema_editor:
    schema_editor.create_model(Category)
    schema_editor.create_model(Product)

# 2. Define a Resource for your Model
class ProductResource(resources.ModelResource):
    category = Field(
        column_name='category_name',
        attribute='category',
        widget=ForeignKeyWidget(Category, 'name') # Match category by name during import/export
    )

    class Meta:
        model = Product
        fields = ('id', 'name', 'price', 'category',) # Fields to include
        export_order = ('id', 'name', 'price', 'category',) # Order for export

# 3. Use the Resource to export data programmatically
category_electronics = Category.objects.create(name='Electronics')
Product.objects.create(name='Laptop', price=1200.00, category=category_electronics)
Product.objects.create(name='Mouse', price=25.00, category=category_electronics)

product_resource = ProductResource()
dataset = product_resource.export()

print("\n--- Exported CSV data ---")
print(dataset.csv)

view raw JSON →