django-import-export数据导入使用实际值而不是foreign_id

时间:2018-01-24 02:48:26

标签: python django

我成功安装了django-import-export app,我可以从admin导入数据。假设我有一些数据库:

name | system_id          id | system
 a   | 1                   1 | system_a
 b   | 1                   2 | system_b

所以system_id是外键 问题是我想从excel导入数据:

name | system    
 c   | system_c                   
 d   | system_d

如何使数据相互对应。所以我可以在excel中使用系统的真实名称。

3 个答案:

答案 0 :(得分:0)

您可以在继承“resources.ModelResource”类

的类中创建自定义方法
class ApplicationResource(resources.ModelResource):

    class Meta:
        model = <model name>

    def dehydrate_system(self, instance): #def dehydrate_<field name>(self, instanse) 
        return instance.system.title

答案 1 :(得分:0)

我解决了!只需使用ForeignKeyWidget:

system_name = fields.Field(column_name='system', attribute='system', widget=ForeignKeyWidget(model, 'system_name'))

答案 2 :(得分:0)

这是插入一个外键的示例。

    models.py

        from django.db import models

        class Table1(models.Model):
            system = models.CharField(max_length=383)

        class Table2(models.Model):
            name = models.CharField(max_length=383)
            system = models.ForeignKey(Table1, blank=True, null=True, on_delete=models.CASCADE)

您需要创建一个modelResource并覆盖before_import_row以在table1中插入数据。 并将ModelResource设置为admin class。

    admin.py
        from .models import Table1,Table2
        from import_export import resources,widgets
        from import_export.fields import Field
        from django.contrib import admin


        class Table2Resource(resources.ModelResource):
            name = Field(column_name='name',attribute='name')
            system_id = Field(column_name='system', attribute='system_id', widget=widgets.ForeignKeyWidget(Table1))

            class Meta:
                model = Table2
                skip_unchanged = True
                fields = ('name','system_id')

            def before_import_row(self,row, **kwargs):
                value = row['system']
                obj = Table1.objects.create(system = value) #create object place
                row['system'] = obj.id # update value to id ob new object


        @admin.register(Table2)
        class Table2Admin(ImportExportModelAdmin,admin.ModelAdmin):
            resource_class = Table2Resource

这就是全部。