Массовое удаление администратора Django исключает определенный набор запросов - PullRequest
0 голосов
/ 20 мая 2019

У меня есть несколько объектов модели File.

Я пытаюсь отфильтровать и удалить эти файлы на основе определенного условия, но мне это не удается.

Рассмотрим следующее

У меня есть 3 File объектов:

  • File1
  • File2
  • 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 Ответ

2 голосов
/ 20 мая 2019

Итак, если вы хотите это на администратора. Представьте, что у нас есть 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...