如何在使用django导入导出导入文件时删除记录



我的项目使用Django框架并安装了Django导入导出插件。我可以正常进出口所有东西。但当我将文件导入数据库时。已成功导入文件上载中的所有新记录。但是不在新记录中的旧记录不会被删除。

数据库中的旧数据

ID , Name , wage
1 , Mr.A , 100
2 , Mr.B , 110
3 , Mr.C , 150 

新文件上传

ID , Name , wage
1 , Mr.A , 100
2 , Mr.B , 150
4 , Mr.D , 130  

导入时的结果

ID , Name , wage
1 , Mr.A , 100
2 , Mr.B , 150
3 , Mr.C , 150  # < this not delete
4 , Mr.D , 130  

我希望它在数据库中是这样的。

----------
ID , Name , wage
1 , Mr.A , 100
2 , Mr.B , 150
4 , Mr.D , 130  

当使用django导入导出插件导入时,我如何删除旧记录?

这是我的代码

class PersonalResource(resources.ModelResource):
class Meta:
model = Personal
import_id_fields = ('p_id',)

class PersonalAdmin(ImportExportModelAdmin,admin.ModelAdmin):
resource_class = PersonalResource
list_display = ['p_id','name','poistion','dept']
search_fields = ['p_id']

默认情况下,

django-import-export不会为您执行此操作,但您可以轻松添加一些钩子来实现这一点。

您可以跟踪导入或更新的每一行的id,然后在导入结束时删除其他行。

例如:

class PersonalResource(resources.ModelResource):
instances_to_keep = set()
def after_save_instance(self, instance, using_transactions, dry_run):
self.instances_to_keep.add(instance.id)
def after_import(self, dataset, result, using_transactions, dry_run, **kwargs):
Personal.objects.exclude(id__in=self.instances_to_keep).delete()
class Meta:
model = Personal
import_id_fields = ('p_id',)

需要注意的几点:

  • 阅读delete((的含义
  • 您可以考虑在较小数据集的事务中运行此功能

最新更新