Как удалить до n типов данных в self forienkey с помощью django rest framework?

class Directory(models.Model):
    name = models.CharField(max_length=100)
    parent_directory= models.ForeignKey("self", on_delete=models.SET_NULL, null=True, blank=True)

Я хочу удалить корневую папку и все папки, которые находятся внутри корневой папки (корневая папка означает parent_directory is null в модели Directory), https://i.stack.imgur.com/oszCR.png, На этом рисунке root является базовым каталогом, а остальные папки находятся внутри корневой папки, и если я удалю корневую папку, то все папки, которые находятся внутри корневой папки, должны быть удалены ]

для экзамена:

  1. корень - родительский_каталог
  2. тестовые под3 и под4 находятся внутри корневого каталога на основе фото таблицы
  3. Bhavya находится внутри sub4 на основе фото
  4. верх находится внутри Bhavya

Теперь, если я хочу удалить объект номер 22 из корневого каталога, то 26, 29, 33 и 34 также должны быть удалены.


Подскажите, пожалуйста, как можно удалить этот объект n-типа без on_delete=models.CASCADE ?

Вы можете сделать итерационный скрипт, который будет собирать все элементы для удаления. Это сделает 𝓞(d) запросы с d глубиной поддерева, таким образом:

from operator import attrgetter


def delete_with_descendants(*directories):
    next_gen = directories = set(directories)
    while next_gen:
        next_gen = Directory.objects.filter(parent_directory__in=next_gen)
        directories.update(next_gen)
    # directories is a set of Directory objects that you can process
    # …
    # remove the directories
    Directory.objects.filter(pk__in=map(attrgetter('pk'), directories)).delete()

Затем вы можете удалить каталог, включая всех потомков с помощью delete_with_descendants(my_directory).

Вернуться на верх