我正在使用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信息(?)。
答案 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,只需分配 实例的文件名
这不是完美的解决方案,但对我来说效果很好。