seddonym
seddonym

Reputation: 17229

How do I import data using Django-Import-Export?

The documentation for django-import-export is a bit weak on how to configure the admin to import from a spreadsheet. Does anyone have a full example?

Upvotes: 5

Views: 7261

Answers (2)

Isanka Wijerathne
Isanka Wijerathne

Reputation: 4166

This is not a fully complete module. But you can understand how it should be.

resources.py file

from import_export import resources
from .models import edxUser

class edxUserResource(resources.ModelResource):
    class Meta:
        model = edxUser
        #skip_unchanged = True
        #report_skipped = True
        #if you want to exclude any field from exporting
        exclude = ('id','edx_anonymized_id') 
        fields = ('id', 'edx_id', 'edx_anonymized_id', 'edx_email', 'edx_name', 'time_created', 'created_by')
        #Order of the export fields
        export_order = ('edx_id', 'edx_email')

admin.py file

from import_export.admin import ImportExportModelAdmin
from django.contrib import admin
from .models import edxUser
from resources import edxUserResource


@admin.register(edxUser)
class edxUserAdmin(ImportExportModelAdmin):
    resource_class = edxUserResource

models.py file

from __future__ import unicode_literals
from django.conf import settings
from django.db import models

class edxUser(models.Model):
    edx_id = models.IntegerField('edX user id', blank=True, null=True)
    edx_anonymized_id = models.IntegerField("edX anonymized user id", blank=True, null=True)
    edx_email = models.EmailField('edx user email', max_length=75, blank=True)
    edx_name = models.CharField('edx name', max_length=75, blank=True, null=True)
    time_created = models.DateField('Created time', blank=True, null=True)
    created_by = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, blank=True)

    def __unicode__(self):
        return str(self.edx_id)

Upvotes: 3

seddonym
seddonym

Reputation: 17229

Here's how to do it, assuming that the column names in the spreadsheet are Title and Field one. This example assumes that the model instances will be created afresh every import (rather than being updated via a primary key).

from django.contrib import admin
from import_export.admin import ImportMixin
from import_export import resources, fields
from .models import MyModel


class MyModelResource(resources.ModelResource):

    title = fields.Field(attribute='title',
                         column_name='Title')
    field_one = fields.Field(attribute='field_one',
                             column_name='Field one')

    def get_instance(self, instance_loader, row):
        # Returning False prevents us from looking in the
        # database for rows that already exist
        return False

    class Meta:
        model = MyModel
        fields = ('title', 'field_one')
        export_order = fields


class MyModelAdmin(ImportMixin, admin.ModelAdmin):
    resource_class = MyModelResource


admin.site.register(MyModel, MyModelAdmin)

Upvotes: 1

Related Questions