【问题标题】:How do I add the file used to import data with django-import export?如何使用 django-import export 添加用于导入数据的文件?
【发布时间】:2023-03-08 23:45:02
【问题描述】:

我正在使用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 = ?

问题在于传递导入的文件信息(?)。

【问题讨论】:

    标签: django django-import-export


    【解决方案1】:

    你需要覆盖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 方法会有实例,只需要赋值 实例的文件名

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 2022-07-18
      相关资源
      最近更新 更多