How to delete upto n type of data in self forienkey using 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)
I want to delete root folder and all the folders which is inside the root folder (root folder means parent_directory is null in Directory model), https://i.stack.imgur.com/oszCR.png, In this picture root is base directory and rest of the all folders are inside the root folder and if i delete the root folder then all the folders which is inside the root folder needs to be deleted ]
for exam:
- root is parent_directory
- test sub3 and sub4 is inside root directory base on table photo
- Bhavya is inside sub4 based on photo
- top is inside in Bhavya
Now if I want to delete object number 22 means root directory then 26, 29, 33 and 34 should also be deleted.
Would you please let me know how can delete this n type of object without on_delete=models.CASCADE ?
You can make an iterate script that will collect all the items to remove. This will make 𝓞(d) queries with d the depth of the subtree, so:
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()
So you can then delete the directory including all the descendants with delete_with_descendants(my_directory)
.