Django管理员批量删除排除某些查询集

时间:2019-05-20 13:01:17

标签: python django

我有一个File模型的多个对象。

我正在尝试根据特定条件过滤并删除这些文件,但未能成功。

请考虑以下内容

我有3个File对象:

  • 文件1
  • 文件2
  • File3

我试图像这样重写模型的delete()函数:

def delete(self, using=None, keep_parents=False):
    test_qs = File.objects.filter(file_name='File1')
    if test_qs:
        for x in test_qs:
            x.delete()
    super(File, self).delete()

当我转到Django Admin时,选择所有文件(File1,File2和File3)并批量删除它们,所有这些文件都会被删除,而不仅仅是File1。

在我的Django控制台File.objects.filter(file_name='File1')中,返回仅包含File1的查询集。

我还试图像这样覆盖pre_delete信号:

@receiver(pre_delete, sender=File)
def delete_certain_files(sender, instance, **kwargs):
    test_qs = File.objects.filter(file_name='File1')
    test_qs.delete()

但是,这将导致RecursionError

如何确保在批量删除时仅删除满足特定条件的File对象?

1 个答案:

答案 0 :(得分:2)

因此,如果您希望在admin上使用此功能。想象我们有Foo模型和FooAdmin类

class FooAdmin(admin.ModelAdmin):

    actions = ['delete_selected']

    def delete_selected(self, request, queryset):
        # request: WSGIRrequest
        # queryset: QuerySet, this is used for deletion
        lookup_kwargs = {'pk__gt': 5000} # you can add your own condition.
        queryset.filter(**lookup_kwargs)

admin.site.register(Foo, FooAdmin)