使用 django-import-export 导入文件时如何删除记录?

How i can to delete record when import file using django-import-export?

我的项目使用 Django 框架并安装了 django-import-export 插件。我可以正常导入和导出所有内容。但是当我将文件导入数据库时​​。文件上传的所有新记录均已成功导入。但不在新记录中的旧记录不会删除。

数据库中的旧数据

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-import-export 插件导入时如何删除旧记录?

这是我的代码

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',)

注意事项: