如何使用django-import export添加用于导入数据的文件?

时间:2019-03-13 01:20:00

标签: django django-import-export

我正在使用django-import-export来允许我的应用程序的用户将自己的数据导入数据库。我已经使用所需的字段创建了适当的资源。它可以正常工作。

下一步,我要在用户导入的数据旁边添加使用过的文件,以便向用户显示其导入的文件和信息。

我不是将文件保存到服务器上,而是对其进行处理。

首先,我创建了一个名为FileImported的新模型来保存用于导入的文件的信息:

class FileImported(models.Model):
     filename = models.CharField()
     name = models.CharField()
     size = models.DecimalField()
     extension = models.CharField()
     date = models.DateField(auto_now_add=True)
     time = models.TimeField(auto_now_add=True)
     timestamp = models.DateTimeField(auto_now_add=True)
     user = models.ForeignKey(User, default=1, on_delete=models.CASCADE)

     def __str__(self):
         return self.filename

然后我必须传递文件信息:

result = imported_resource.import_data(dataset, dry_run=True,
                                           raise_errors=False,
                                           file_name=import_file_name,
                                           user=self.request.user,
                                           file_size=import_file_size,
                                     file_extension=import_file_extension)

此后,我将在导入之前创建一个新的FileImported模型对象:

class ImportedResource(resources.ModelResource):

   .........

    def before_import(self, dataset, using_transactions, dry_run, **kwargs):
        file_name = kwargs.get('file_name', 'unknown')
        name = os.path.splitext(file_name)[0]
        file_size = kwargs.get('file_size', 'unknown')
        file_extension = kwargs.get('file_extension', 'unknown')
        user = kwargs.get('user', 'unknown')

        file_name_model_object = FileImported .objects.get_or_create(filename=file_name,
                                                                name=name,
                                                                size=file_size,
                                                                extension=file_extension,
                                                                user=user)

我在模型中添加了以下字段:

imported = models.BooleanField(default=False)
imported_file = models.ForeignKey(FileImported, on_delete=models.CASCADE,blank = True,null=True)

最明显的方法是将imported_file字段添加到资源中的字段。这样,用户可能必须自己填写该内容,或者将其保留为空白或隐藏,然后再填充。

如果不是字段之一,则不确定如何将新创建的FileImported模型对象添加到数据的每一行。

我正在考虑使用before_save_instance并执行以下操作:

def before_save_instance(self, instance, using_transactions, dry_run):
    instance.imported = True
    instance.imported_file = ?

问题正在传递imported_file信息(?)。

1 个答案:

答案 0 :(得分:0)

您需要覆盖2种方法:-

class EmailResource(resources.ModelResource):
    class Meta:
        model = Email
        fields = ('email',)
    def after_import_instance(self, instance, new, **kwargs):
        self.file_name = kwargs.get('file_name', 'unknown')


    def before_save_instance(self, instance, using_transactions, dry_run):
         if not dry_run:
             instance.filename  = self.file_name

如示例所示

  

after_import_instance方法将在导入文件后获取文件名。并在对象中添加文件名

     

before_save_instance方法将具有instance,只需分配   实例的文件名

这不是完美的解决方案,但对我来说效果很好。